workerman/http/client,定时器不断增加是正常还是Bug?

veinliu

经过测试,http/client 每连接一次计时器数量加一,时间长了CPU占用老高了。

3324 6 0
6个回答

veinliu

是我打开方式不对还是怎么回事?

  • 暂无评论
veinliu
 public function __construct($option = [])
    {
        $this->_option = $this->_option = array_merge($this->_option, $option);
       // Timer::add(1, [$this, 'closeTimeoutConnection']);

       // var_dump();
    }
注头释掉线程池里面的定时器这一行,定时器不再增加,但是不知道线程池是不是没有了?
打算再改一改,到closeTimeoutConnection,里面close 连接的时候unset定时器不知道哪个比较科学。
  • 暂无评论
walkor 打赏

每个client实例有一个定时器。业务代码复用workerman/http/client实例,不要每次都初始化一个workerman/http/client实例

  • veinliu 2019-12-21

    非常感谢,我是要连接不同的IP的不同端口很多次去查询结果,不知道实例化应该写在哪里,能不能给提供一个例子参考。新手,真没什么概念,我先自己想,您能提供个例子就更好了。

veinliu
 $inner_http_worker1 = new Worker('http://0.0.0.0:2122');
        // 当http客户端发来数据时触发
        $inner_http_worker1->onMessage = function($http_connection, $data) {
             global $uidConnectionMap,$rfid,$channel;
            $_POST = $_POST ? $_POST : $_GET;
            $channel = @$_POST['channel'];
            $position = @$_POST['position'];
            $rfid = @$_POST['rfid'];
            //var_dump($_POST);
            $post = "{way_code:001,position:".$position.",RfidNo:".$rfid."}";
            //$post = '{"way_code":"001","position":"1","RfidNo":"1000000002"}';
           // var_dump($post);
            $http = new Workerman\Http\Client();
            //var_dump($channel);
            //$http->post('http://172.50.10.2:7090/facematch/v1/request', $post, function($response) {
            $http->post('http://'.$channel.':7090/facematch/v1/request',  $post, function($response){
             //   var_dump($response->getStatusCode());

                $data = json_decode($response->getBody(),true);
               // var_dump($data);
                echo ($response->getBody());
                if ($data['Content'] != null && $data['Status'] == 1){
                  //  var_dump($response->getBody());
                    new passenger($response->getBody(),$GLOBALS['channel']);

                }
                //global $rfid;
              //  var_dump($GLOBALS['rfid']);

            }, function($exception){
                $ident = 'FR2SAC';
                new logErr($ident,$exception);
               // echo $exception;
            });

            return $http_connection->send('1');
        };`
        $inner_http_worker->listen();
//比方说这段代码,我多次的post url 和数据,让httpclient去取结果,我没编过程,没参考代码我就不知道怎么弄了。
  • 暂无评论
veinliu

改好了,今天去服务器上更新一下。
昨天下午注释掉了定时器那行,在生产中运行,今天去应该程序还没什么问题。看了定时器的用法,才明白定时器那行是每秒去做一次超时连接断开。

  • 暂无评论
workmanxinshou

在 onWorkerStart 回调中实例化 http/Client

  • veinliu 2019-12-22

    说来惭愧,我知道在onWorkerStart中实例化,但在$inner_http_worker1->onMessage中老提示没定义这个变量,网上找了老半天才知道怎么弄,没编过程的人对代码一点概念都没有。

  • veinliu 2019-12-22

    好在,有worker这样的大师级的人物写出了这么好用的框架,再加上有这么多高手网上给解决问题提出意见。

年代过于久远,无法发表回答
×
🔝