使用AsyncTcpConnection測試并發(fā)的時候,多次測試都一樣會在一定時間后沒有心跳連接無效
然而比較有規(guī)律的是每次的剩余有效連接數(shù)都是固定的54個(windows),把代碼放到linux環(huán)境下測試也情況類似
感覺是不是有什么很重要的設(shè)置我遺漏了,求大大拯救~
謝謝
初始代碼:
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 )
{
//設(shè)置初始時間
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循環(huán),更換另外一種方式創(chuàng)建連接之后:
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";
}
多次測試,連接數(shù)固定剩余127
[attach]494[/attach]
我這里Debian系統(tǒng)測試是ok的。
linux系統(tǒng)需要安裝libevent擴展或者event擴展,還需要將系統(tǒng)內(nèi)核優(yōu)化好,參見http://doc3.workerman.net/appendices/kernel-optimization.html,否則單個進程無法打開高于1024個鏈接句柄,因為測試程序是自己連自己,發(fā)起1000個鏈接,實際在當(dāng)前進程打開了2000個鏈接句柄。
另外不要在windows里做這種測試,經(jīng)過很多人驗證,windows系統(tǒng)默認有個256的限制,每個進程最多打開256個鏈接句柄。