关于断开客户端连接后,Events::onClose 中调用 Gateway::getUidByClientId 返回空值null问题

phpcreeper

问题重现:

模拟一客户端成功与服务器建立连接
事先在 Events::onConnect 中调用 Gateway::bindUid
Events::onClose 中调用 Gateway::getUidByClientId
模拟断开客户端连接,结果 Gateway::getUidByClientId 返回空值null

[attach]1194[/attach]

问题调试:
如图 return 断点调试,发现能如期获取到映射的uid, 个人理解原因是:
$this->sendToWorker 异步通知 Events,BusinessWorker异步收到转发来的数据,
导致 Events::onClose 业务逻辑可能尚未执行,而断点后的清理代码已经先行执行完毕了,
不知道理解是否正确?如果理解正确,那么如题如何正确获取到映射uid?

期望结果:
期望业务逻辑执行完成后,再行断点后的后续清理工作。

3405 1 0
1个回答

walkor 打赏

是的,连接断开后Gateway会立刻清理对应连接的数据,包括uid绑定数据。

在onClose回调中无法使用此接口,解决方法是bindUid时记录一个$_SESSION=uid,Events::onClose的时候用$_SESSION来获取uid。
但是仍然要注意$_SESSION一般是在onMessage/onWebSocketConnect里赋值的,但是onMessage/onWebSocketConnect在onClose调用前不一定会被调用,比如客户端发起了tcp连接后未发送任何数据然后关闭了连接,类似这种情况服务端Events ::onClose回调中不会有$_SESSION值,所以Events::onClose中获取$_SESSION值需要判断下uid键值是否存在。

在手册中有提到,onClose回调中无法使用此接口,按照手册方法用session来获得

  • none 2019-09-25

    那这个问题有什么解决方案吗? 我也碰到了,目前我想的是在gateway里也存一个session

年代过于久远,无法发表回答
×
🔝