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

dou号

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

有什么不同吗?

阅读 2725
3个回答

blogdaren

问题一:
个人感觉疑点有两处:
(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成功后短时间又掉线,因为并不是所有的设备都这样,只有部分设备出现了这种情况,而且这部分设备也不是一直会出现这样情况,只要多登陆几次这种情况就会消失,但是设备断电重启后又会这样,多登陆几次又会变正常

  • blogdaren 2018-09-14

    不清楚你具体客户端心跳逻辑以及服务端对心跳以及登录逻辑的处理细节,只能推测可能是:

    1. 心跳指令发过来时,上次的连接已经被干掉【比如在规定时间内有些客户端设备未回心跳包或未发送数据】,此时已经是个新连接,然后由于未bindUid(),所以Gateway::isUidOnline($uid)会表现为离线。
    2. 建议你监测下 onClose 回调以排查连接是否存在被干掉的情况。
    3. 要还不行,就请 walkor 大大看看啥情况吧。
ymb

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

  • walkor 2020-07-22

    服务端运行命令 ps auxf,看下是不是运行了多个gatewayWorker

  • ymb 2020-07-22

    感谢作者回复 刚看了 好像只是执行了一个gatewayWorker
    10:01 0:00 _ WorkerMan: worker process YourAppGateway websocket://0.0.0.0:8282
    root 26458 0.0 0.2 218508 9632 ? S 10:01 0:00 _ WorkerMan: worker process YourAppGateway websocket://0.0.0.0:8282
    root 26459 0.0 0.3 220552 11688 ? S 10:01 0:02 _ WorkerMan: worker process YourAppGateway websocket://0.0.0.0:8282
    root 26460 0.0 0.2 218504 9632 ? S 10:01 0:00 _ WorkerMan: worker process YourAppGateway websocket://0.0.0.0:8282