以下代码是心跳的demo
假如开了4个进程,岂不是每个进程都会每隔10秒轮询检测一次是否超时?
这样操作是不是太频繁了?
如果指定某个进程轮询,其他进程的连接又检测不到
==========
// 进程启动后设置一个每10秒运行一次的定时器
$worker->onWorkerStart = function($worker) {
Timer::add(10, function()use($worker){
$time_now = time();
foreach($worker->connections as $connection) {
// 有可能该connection还没收到过消息,则lastMessageTime设置为当前时间
if (empty($connection->lastMessageTime)) {
$connection->lastMessageTime = $time_now;
continue;
}
// 上次通讯时间间隔大于心跳间隔,则认为客户端已经下线,关闭连接
if ($time_now - $connection->lastMessageTime > HEARTBEAT_TIME) {
$connection->close();
}
}
});
};
这个定时器内仅仅是纯粹的检测又没有什么复杂的业务逻辑,一般不会对服务器造成压力的;另外根据路由器节点防火墙的反空闲超时时间来评估定时频率推荐最好设置为50秒。
心跳不是推荐55秒?
检测间隔约等于或者大于心跳间隔,似乎也不会出什么问题.,
迟一些断开也没啥问题
小于60秒都是合理的、50秒、55秒都是相对合理的设置、别陷坑。