workerman中gatewayworker的isUidOnline($uid)判断不在线。
问题一:worker大神,我这边的设备已经成功登陆了,并绑定了uid,在接受心跳指令的时候,我这边做了一个uid是否在线的判断,但是设备在第一次成功登陆,并发送心跳过来时,Gateway::isUidOnline($uid)总是判断不在线,当设备重新登陆后,再发送心跳时,Gateway::isUidOnline($uid)会判断在线,我打印了$client_idarr,即uid绑定的clientid;
Gateway::bindUid($client_id,$uid);
$client_idarr = Gateway::getClientIdByUid($uid);
发现该变量有值,那么设备应该是成功绑定client_id了,也打印了uid,发现uid也正常,但是Gateway::isUidOnline($uid)却还是判断不在线,还有一点就是并不是所有设备都有这种情况,还请大神赐教
问题二:
$gateway->pingInterval = 55;
$gateway->pingNotResponseLimit = 2;
和
$gateway->pingInterval = 110;
$gateway->pingNotResponseLimit = 1;
有什么不同吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
问题一:
isUidOnline是基于getClientIdByUid实现的,所以如果
Gateway::getClientIdByUid($uid);
有值,那么isUidOnline肯定会返回非0的值,同时打印下isUidOnline和getClientIdByUid的返回值看下。问题二:
根据手册
代表服务端每55秒给客户端发送一次心跳(pingData有值的情况下),如果客户端55*2=110秒内没有任何数据发来,则代表客户端已经掉线,服务端执行关闭连接
则是110秒发送一次心跳给客户端,同样是110秒内没有任何数据发来,则代表客户端已经掉线,服务端执行关闭连接
手册:http://doc2.workerman.net/hea...
@walkor
关于问题二,我有个疑惑,请指导下:
根据参看源码以及试验,假定在 pingNotResponseLimit > 0 情况下,对于两种写法,我理解的是:
(1)【这个应该是没有问题】两种写法均代表:若客户端连接 pingInterval * pingNotResponseLimit = 110 秒内没有任何请求,则服务端认为对应客户端已经离线,服务端主动关闭连接并触发onClose回调 。
(2)【这个我理解的不一样】两种写法区别是:两种写法均代表每间隔 pingInterval / 2 秒发送一次心跳,心跳检测频率次数是: pingNotResponseLimit * 2,即心跳检测间隔时间和检测频率不一样。
(1)是的
(2)每隔pingInterval时间发送一次心跳,并不是 pingInterval/2 秒发送一次。但是服务端会pingInterval/2秒检测一次是否有客户端超过 pingInterval * pingNotResponseLimit秒没有发来任何数据,如果有认为客户端掉线并关闭对应的连接。