AsyncTcpConnection掉线

buildinghe

使用AsyncTcpConnection测试并发的时候,多次测试都一样会在一定时间后没有心跳连接无效
然而比较有规律的是每次的剩余有效连接数都是固定的54个(windows),把代码放到linux环境下测试也情况类似
感觉是不是有什么很重要的设置我遗漏了,求大大拯救~
谢谢

初始代码:

for ( $i = 0; $i < 200; $i++ )
            {
                $con            = new AsyncTcpConnection('ws://127.0.0.1:2211');
                $con->cust_id   = $i;
                $con->onConnect = function ($con)
                {
                    $con->send("connect");
                    Timer::add(2, function () use ($con)
                    {
                        $con->send("ping");
                    });
                };
                $con->onMessage = function ($con, $msg)
                {

                };
                $con->onClose   = function ($con)
                {
//                  echo $con->cust_id." con close\n";
                };

                $con->connect();
                echo $i, " connections complete\n";
            }

            Timer::add(5, function () use ($worker)
            {
                $time_now = time();
                $n        = 0;
                foreach ( $worker->connections as $connection )
                {
                    //设置初始时间
                    if ( empty( $connection->lastMessageTime ) )
                    {
                        $connection->lastMessageTime = $time_now;
                        continue;
                    }
                    $interval = $time_now - $connection->lastMessageTime;
                    if ( $interval > 20 )
                    {
//                      echo "[{$time_now}-=\n";
                        $connection->close();
                    }
                    $n++;
                }
                echo date("Y-m-d H:i:s") . "\t" . "total:{$n}\n";
            });

如图:

图片
图片

后来更换linux测试同样的代码也是类似的情况,如图:
图片

不使用for循环,更换另外一种方式创建连接之后:

function startTest()
        {
            static $count = 0;
            if ( $count >= 1000 )
            {
                return;
            }
            $count++;
            $con            = new AsyncTcpConnection('ws://127.0.0.1:2211');
            $con->cust_id   = $count;
            $con->onConnect = function ($con)
            {
                $this->startTest();
                Timer::add(2, function () use ($con)
                {
                    $con->send("ping");
                });
            };
            $con->onMessage = function ($con, $msg)
            {

            };
            $con->onError   = function ($connection, $code, $msg)
            {
                echo "error $code $msg\n";
            };
            $con->onClose   = function ($con)
            {
//                  echo $con->cust_id." con close\n";
            };

            $con->connect();
            echo $count, " connections complete\n";
        }

图片

多次测试,连接数固定剩余127

3210 3 0
3个回答

walkor

样式乱了,把所有代码用附件的方式传上来给大家运行看看吧

  • 暂无评论
buildinghe

各位大大,测试代码在这。直接php Task.php。

  • 暂无评论
walkor

[attach]494[/attach]

我这里Debian系统测试是ok的。
linux系统需要安装libevent扩展或者event扩展,还需要将系统内核优化好,参见http://doc3.workerman.net/appendices/kernel-optimization.html,否则单个进程无法打开高于1024个链接句柄,因为测试程序是自己连自己,发起1000个链接,实际在当前进程打开了2000个链接句柄。

另外不要在windows里做这种测试,经过很多人验证,windows系统默认有个256的限制,每个进程最多打开256个链接句柄。

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