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

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

888.png


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

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

walkor

赞同来自:

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

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



在手册中有提到,onClose回调中无法使用此接口

要回复问题请先登录注册