根据示例的心跳代码,感觉定时器触发有点问题

chen12315

文档示例的代码是用定时器去获取心跳包超时了没有,但是我加了打印发现判断空的这个一直没有打印出来。
请问是示例代码有问题吗 还是我这个有问题,

onWorkerStart里面的定时器代码

define('HEARTBEAT_TIME', 10);

Timer::add(2, function () use ($db, $ad_worker) {
        $time_now = time();
        foreach ($ad_worker->connections as $connection) {
            // 有可能该connection还没收到过消息,则lastMessageTime设置为当前时间
            if (empty($connection->lastMessageTime)) {
                print_r('empty:' . PHP_EOL);
                $connection->lastMessageTime = $time_now;
                continue;
            }
            // 上次通讯时间间隔大于心跳间隔,则认为客户端已经下线,关闭连接
            if ($time_now - $connection->lastMessageTime > HEARTBEAT_TIME) {
                OffLine($db, $connection);
                print_r('offline:' . $connection->id . PHP_EOL);
                $connection->close();
            }
        }
    });

onMessage里面

 $connection->lastMessageTime = time();
2731 1 0
1个回答

walkor

onMessage里面
$connection->lastMessageTime = time();
如果执行了,那么
if (empty($connection->lastMessageTime)) {
分支当然不会进入了...

  • chen12315 2018-07-02

    噢 是这样的 谢谢,但是我还发现一个问题,我客户端断开了连接之后,最后也不会跑到if ($time_now - $connection->lastMessageTime > HEARTBEAT_TIME) 这个if里面 不知道是为什么

  • walkor 2018-07-02

    连接断开了触发onClose时对应的connection会从$ad_worker->connections里删除

  • chen12315 2018-07-02

    噢噢 就是说删除了所以没办法在循环里面找到了吗

年代过于久远,无法发表回答
🔝