文档示例的代码是用定时器去获取心跳包超时了没有,但是我加了打印发现判断空的这个一直没有打印出来。
请问是示例代码有问题吗 还是我这个有问题,
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();
onMessage里面
$connection->lastMessageTime = time();
如果执行了,那么
if (empty($connection->lastMessageTime)) {
分支当然不会进入了...
噢 是这样的 谢谢,但是我还发现一个问题,我客户端断开了连接之后,最后也不会跑到if ($time_now - $connection->lastMessageTime > HEARTBEAT_TIME) 这个if里面 不知道是为什么
连接断开了触发onClose时对应的connection会从$ad_worker->connections里删除
噢噢 就是说删除了所以没办法在循环里面找到了吗