環(huán)境如下:
服務(wù)器ubuntu20.04,用docker跑了laradock,在docker的workspace中start server。PHP版本是8.0.18.
之前一直是好的,某一天我忘了干了什么,突然就不行了。我比較了vendor/workerman下所有文件以及node_modules/socket_io下所有文件,發(fā)現(xiàn)文件沒有變化。服務(wù)器軟件也沒有動(dòng),我可能就是安裝了一下laravel官方的jetstream插件,安裝的時(shí)候還特意切了branch。
SocketIO.on('connection')回調(diào)函數(shù)如下:
function(Socket $client) {
Worker::safeEcho("Client connected.\n");
$client->emit('info', 'connected from client');
}
服務(wù)端打印Clientconnected之后,就沒有反應(yīng)了
客戶端代碼:
<script src='https://cdn.bootcss.com/socket.io/2.0.3/socket.io.js'></script>
<script>
let socketIO = io('http://192.168.1.83:8026');
socketIO.on('connect', function() {
console.log('connected to socket server');
});
socketIO.on('info', function(data) {
console.log('get message:' + data)
});
</script>
經(jīng)檢查,發(fā)現(xiàn)第一次嘗試訪問
http://192.168.1.83:8026/socket.io/?EIO=3&transport=polling&t=O5t2B5k
服務(wù)端正確返回sid等信息
第二次帶上sid,再請(qǐng)求
http://192.168.1.83:8026/socket.io/?EIO=3&transport=polling&t=O5t2B5-&sid=f4a6cc4a75abd841048c277e
這個(gè)請(qǐng)求一直是pending狀態(tài),直到最后服務(wù)端超時(shí),服務(wù)端認(rèn)為客戶端disconnect,觸發(fā)disconnect事件??蛻舳巳匀槐3謕ending,然后socket.io嘗試重連服務(wù)器,再來獲得新的sid,如此反復(fù)。在服務(wù)端,有時(shí)候會(huì)出現(xiàn)多個(gè)connection。
ws://192.168.1.83:8026/socket.io/?EIO=3&transport=websocket&sid=f4a6cc4a75abd841048c277e
這個(gè)請(qǐng)求返回只有2probe和3probe,接下來正常應(yīng)該有個(gè)5,然后再是4message之類的吧,通通都沒有。
我打了一下log,發(fā)現(xiàn)服務(wù)端在可能是卡在TcpConnection中大約590行左右
while ($this->_recvBuffer !== '' && !$this->_isPaused)
這個(gè)循環(huán)中一直沒有返回。第一次帶上upgrade之后,沒有第二次處理了。
服務(wù)端代碼
while ($this->_recvBuffer !== '' && !$this->_isPaused) {
if ($this->protocol == 'Protocols\SocketIO') {
var_dump($this->_recvBuffer, $this->_currentPackageLength);
}
。。。
}
服務(wù)端當(dāng)時(shí)upgrade的recvBuffer是這個(gè)值
string(565) "GET /socket.io/?EIO=3&transport=websocket&sid=b877a68c75abd84104263d3d HTTP/1.1
Host: 192.168.1.83:8026
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36 SE 2.X MetaSr 1.0
Upgrade: websocket
Origin: file://
Sec-WebSocket-Version: 13
DNT: 1
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Sec-WebSocket-Key: SFFWZpMqtBAHu7hRaZexYA==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
"
然后就沒有然后了。。。
這時(shí)候本來應(yīng)該有繼續(xù)處理過程的
希望有人能幫忙指個(gè)方向,謝謝。
更新一下,如果我在服務(wù)端回調(diào)函數(shù)
function(Socket $client) {
Worker::safeEcho("Client connected.\n");
$client->emit('info', 'connected from client');
}
加一個(gè)usleep(100);
function(Socket $client) {
Worker::safeEcho("Client connected.\n");
usleep(100);
$client->emit('info', 'connected from client');
}
剛才簡單的代碼是可以工作的,但是我實(shí)際代碼會(huì)復(fù)雜很多,一樣不行。我印象中不應(yīng)該加,文檔中也沒有看到說要等待,只是測(cè)試一下而已。
已經(jīng)解決。
某個(gè)自定義event,$client->on()第二個(gè)參數(shù)callback傳入了一個(gè)null,做測(cè)試的時(shí)候?qū)懥藗€(gè)擴(kuò)展類,被打斷之后忘了寫callback實(shí)現(xiàn)。
費(fèi)了兩天時(shí)間,反復(fù)對(duì)比,后來發(fā)現(xiàn)方向完全錯(cuò)了。
是不是如果在on上加一個(gè)判斷,比如is_callable之類的,是不是會(huì)好一些?