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