PHPSocketIO不工作,emit没有作用

zhouyanqin

环境如下:
服务器ubuntu20.04,用docker跑了laradock,在docker的workspace中start server。PHP版本是8.0.18.
之前一直是好的,某一天我忘了干了什么,突然就不行了。我比较了vendor/workerman下所有文件以及node_modules/socket_io下所有文件,发现文件没有变化。服务器软件也没有动,我可能就是安装了一下laravel官方的jetstream插件,安装的时候还特意切了branch。

SocketIO.on('connection')回调函数如下:
function(Socket $client) {
Worker::safeEcho("Client connected.\n");
$client->emit('info', 'connected from client');
}
服务端打印Clientconnected之后,就没有反应了

客户端代码:
<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>

经检查,发现第一次尝试访问
http://192.168.1.83:8026/socket.io/?EIO=3&transport=polling&t=O5t2B5k
服务端正确返回sid等信息
第二次带上sid,再请求
http://192.168.1.83:8026/socket.io/?EIO=3&transport=polling&t=O5t2B5-&sid=f4a6cc4a75abd841048c277e
这个请求一直是pending状态,直到最后服务端超时,服务端认为客户端disconnect,触发disconnect事件。客户端仍然保持pending,然后socket.io尝试重连服务器,再来获得新的sid,如此反复。在服务端,有时候会出现多个connection。
ws://192.168.1.83:8026/socket.io/?EIO=3&transport=websocket&sid=f4a6cc4a75abd841048c277e
这个请求返回只有2probe和3probe,接下来正常应该有个5,然后再是4message之类的吧,通通都没有。
我打了一下log,发现服务端在可能是卡在TcpConnection中大约590行左右
while ($this->_recvBuffer !== '' && !$this->_isPaused)
这个循环中一直没有返回。第一次带上upgrade之后,没有第二次处理了。
服务端代码
while ($this->_recvBuffer !== '' && !$this->_isPaused) {
if ($this->protocol == 'Protocols\SocketIO') {
var_dump($this->_recvBuffer, $this->_currentPackageLength);
}
。。。
}

服务端当时upgrade的recvBuffer是这个值
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

"
然后就没有然后了。。。
这时候本来应该有继续处理过程的

希望有人能帮忙指个方向,谢谢。

890 2 0
2个回答

zhouyanqin

更新一下,如果我在服务端回调函数
function(Socket $client) {
Worker::safeEcho("Client connected.\n");
$client->emit('info', 'connected from client');
}
加一个usleep(100);
function(Socket $client) {
Worker::safeEcho("Client connected.\n");
usleep(100);
$client->emit('info', 'connected from client');
}
刚才简单的代码是可以工作的,但是我实际代码会复杂很多,一样不行。我印象中不应该加,文档中也没有看到说要等待,只是测试一下而已。

  • zhouyanqin 2022-06-19

    再更新一下,同样基于ws协议的browsersync能正常工作,所以应该不是网络问题

zhouyanqin

已经解决。
某个自定义event,$client->on()第二个参数callback传入了一个null,做测试的时候写了个扩展类,被打断之后忘了写callback实现。
费了两天时间,反复对比,后来发现方向完全错了。
是不是如果在on上加一个判断,比如is_callable之类的,是不是会好一些?

  • 暂无评论
年代过于久远,无法发表回答
🔝