关于AsyncTcpConnection,异步阻塞问题

h8h8
$socket     = new AsyncTcpConnection($tcp); 

$socket->onConnect = function($socket) use($db)
        {
           //在这里循环发送消息,发现全部循环完毕后,才接收到返回结果,在循环过程中,全部是阻塞的吗?
            for($i = 0; $i < 1000; $i++)
            {
                 $request = send_datas1($db);
                 //print_r($request);
                 $socket->send($request);                  
            }                                  
        };

        //服务器响应,接收返回结果
        $socket->onMessage = function($socket, $result) use($db)
        {
            try
            {
                print_r($result);
                $db->update($table)->cols($result)->where()->query();
            }
            catch(\Exception $e)
            {
                print_r($e->getMessage());              
            }                                                    
        };

        $socket->onClose = function($socket) {
            // 如果连接断开,则在1秒后重连
            $socket->reConnect(1);
        };

        $socket->onError = function($socket, $err_code, $err_msg)
        {

        };
        // 执行异步链接
        $socket->connect();
4149 5 0
5个回答

walkor

循环过程中,代码执行环境一直在这个循环里,workerman一直没有得到运行控制权,workerman就不会接收到数据,不会触发onmessage。你这里只有当onConnect里所有代码执行完毕,workerman才会获得控制权,才会接收数据。

  • 暂无评论
h8h8

如果做到实时接时,改成这样吗?

for($i = 0; $i < 1000; $i++)
{
    $socket = new AsyncTcpConnection($tcp);

    $socket->onConnect = function($socket) use($db)
    {
        $request = send_datas1($db, $i);
        $socket->send($request);
    };

    $socket->onMessage = function($socket, $result) use($db)
    {
        print_r($result);
    };
    // 执行异步链接
    $socket->connect();
}

这样会不会建立1000个链接,导致性能下降?

  • 暂无评论
walkor

效果一样,for循环里执行完毕才能有机会触发onmessage。

  • 暂无评论
walkor

上面两个for循环执行很快的,可能就0.001秒的时间,我觉得你没必要纠结这点时间。

  • 暂无评论
h8h8

谢谢!!!!

  • 暂无评论
年代过于久远,无法发表回答
🔝