使用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
样式乱了,把所有代码用附件的方式传上来给大家运行看看吧
各位大大,测试代码在这。直接php Task.php。
[attach]494[/attach]
我这里Debian系统测试是ok的。
linux系统需要安装libevent扩展或者event扩展,还需要将系统内核优化好,参见http://doc3.workerman.net/appendices/kernel-optimization.html,否则单个进程无法打开高于1024个链接句柄,因为测试程序是自己连自己,发起1000个链接,实际在当前进程打开了2000个链接句柄。
另外不要在windows里做这种测试,经过很多人验证,windows系统默认有个256的限制,每个进程最多打开256个链接句柄。