測試客戶端用的workerman
// 當(dāng)前鏈接每1秒發(fā)個心跳包
Timer::add(1, function () use ($con) {
$data = 'send 8000,86358603733073,0003,AA00000000,0003,00,0818031611,,,,0000'. "\r\n";
for ($i=0;$i<100;$i++){
$data .= 'send 8000,86358603733073,0003,AA00000000,0003,00,0818031611,,,,0000'. "\r\n";
}
$con->send($data);
});
$con->connect();
echo $count, "connections complete\n";
開了100個連接,GW運行幾分鐘報錯
exit with status 9
Warning: stream_socket_client(): unable to connect to tcp://127.0.0.1:12345 (Cannot assign requested address)
如果連接數(shù)在開多點,Gateway也會無法連接,錯誤信息
Exception: can not connect to tcp://127.0.0.1:2901 Connection refused in GatewayWorker/vendor/workerman/gateway-worker/src/Lib/Gateway.php:725
請問這個錯誤是不是
maxSendBufferSize 是發(fā)送緩沖區(qū)的大小,當(dāng)服務(wù)端發(fā)送速度大于客戶端接收速度時,數(shù)據(jù)會擠壓在發(fā)送緩沖區(qū),如果發(fā)送緩沖區(qū)滿,則觸發(fā)onBufferFull事件回調(diào),在這個事件回調(diào)中做處理(例如停止向客戶端繼續(xù)發(fā)送數(shù)據(jù))。
如果onMesage不能及時處理數(shù)據(jù),數(shù)據(jù)會首先數(shù)據(jù)會積壓在客戶端socket發(fā)送緩沖區(qū)(操作系統(tǒng)提供,大小約幾十K)和workerman服務(wù)器的socket接受緩沖區(qū)(操作系統(tǒng)提供,大小約幾十K),如果客戶端socket發(fā)送緩沖區(qū)滿,則客戶端調(diào)用socket寫操作將阻塞(block模式)或者立刻返回失敗(非阻塞模式),當(dāng)服務(wù)端onMessage處理完畢再次讀取本地socket接收緩沖區(qū)數(shù)據(jù)后,客戶端socket發(fā)送緩沖區(qū)的數(shù)據(jù)會繼續(xù)發(fā)送過來到服務(wù)端socket接收緩沖區(qū),然后依次循環(huán)。
所以當(dāng)服務(wù)端onMessage不能及時處理數(shù)據(jù),不會導(dǎo)致maxSendBufferSize滿,但是可能會導(dǎo)致數(shù)據(jù)在客戶端和服務(wù)端的socket緩沖區(qū)積壓。
引起的?
要怎么解決?
嗯內(nèi)核我參照手冊做過優(yōu)化的,估計是我調(diào)用異步任務(wù)的時候不關(guān)閉連接引起的
$task_connection = new AsyncTcpConnection('Text://127.0.0.1:12345');
$task_connection->send($message);
$task_connection->onMessage = function ($task_connection, $task_result) use ($client_id) {
if ($task_result == 'ok') {
// $task_connection->close();
Gateway::sendToClient($client_id, 1);
}
};
$task_connection->connect();
因為我在測試的時候發(fā)現(xiàn)這里連接關(guān)閉以后,好像客戶端會自動斷開連接,我服務(wù)端開了30S的心跳檢測
關(guān)閉異步連接,客戶端就正常不會斷開 我也不知道哪里出問題了
另外我想問下 就是我客戶端發(fā)送的數(shù)據(jù)量 就比如上面這個字符串的大小 會有什么影響嗎?
測試的時候我如果數(shù)據(jù)量小沒問題,如果和上面一樣200條一起發(fā),運行一會有些客戶端連接會被強制關(guān)閉,看了下服務(wù)器負(fù)載是已經(jīng)超了很多了,是不是負(fù)載的原因引起連接被關(guān)閉呢