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;
有什么不同吗?

阅读 4.8k
3 个回答

问题一:

    public static function isUidOnline($uid)
    {
        return (int)static::getClientIdByUid($uid);
    }

isUidOnline是基于getClientIdByUid实现的,所以如果Gateway::getClientIdByUid($uid);有值,那么isUidOnline肯定会返回非0的值,同时打印下isUidOnline和getClientIdByUid的返回值看下。

问题二:
根据手册

$gateway->pingInterval = 55;
$gateway->pingNotResponseLimit = 2;

代表服务端每55秒给客户端发送一次心跳(pingData有值的情况下),如果客户端55*2=110秒内没有任何数据发来,则代表客户端已经掉线,服务端执行关闭连接

$gateway->pingInterval = 110;
$gateway->pingNotResponseLimit = 1;

则是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秒没有发来任何数据,如果有认为客户端掉线并关闭对应的连接。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题