设备成功登陆,接受心跳指令时Gateway::isUidOnline($uid)判断不在线

0

问题一: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;

有什么不同吗?

已邀请:

blogdaren - 常年游走于 Linux、PHP、C、VIM 之间【http://www.phpcreeper.com】

赞同来自:

问题一:
个人感觉疑点有两处:
(1)在调用到 Gateway::isUidOnline($uid) 时,确认下对应的client_id是否由于某种原因导致已下线了?
(2)Gateway::isUidOnline($uid) 判断是否在线的逻辑,其实内部调用的正是判断 $client_idarr = Gateway::getClientIdByUid($uid) 【你可以参看源码】,那么据你所述$client_idarr有值,有值就表明 client_id 肯定是在线的,否则还得回到疑点(1)


问题二:
(1)两种写法均代表: 若客户端连接 pingInterval * pingNotResponseLimit = 110 秒内没有任何请求,则服务端认为对应客户端已经离线,服务端主动关闭连接并触发onClose回调。
(2)区别是:心跳检测间隔时间和检测频率不一样。

dou号

赞同来自:

@blogdaren一个是登录指令,一个是心跳指令,登录指令后uid绑定成功并打印出了对应的clientid,但是一分钟之后的心跳指令发过来时,$client_idarr 却没有值了,对应了您的疑点一,现在问题就是并不清楚该设备为何会在绑定uid成功后短时间又掉线,因为并不是所有的设备都这样,只有部分设备出现了这种情况,而且这部分设备也不是一直会出现这样情况,只要多登陆几次这种情况就会消失,但是设备断电重启后又会这样,多登陆几次又会变正常

ymb - 90IT男

赞同来自:

我也是遇到这个问题
就是前端执行一个心跳检测 定时30秒内发送一个数据到服务端维持连接
截图
并我在心跳时候把获取的东西都打印出来
截图
获取的数据 很迷惑 就是有时候 客户端是否在线 Gateway::isOnline 返回是 0 Gateway::isUidOnline 用户是否在线是 返回 是 1 源码的 绑定用户id的 Gateway::getClientIdByUid 返回有数组
还有就是几个用户同时连接 短时间内 总一两个掉线的...
截图
想问一下作者解决了这个问题了吗?

要回复问题请先登录注册