以下代碼是心跳的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;
}
// 上次通訊時間間隔大于心跳間隔,則認為客戶端已經(jīng)下線,關閉連接
if ($time_now - $connection->lastMessageTime > HEARTBEAT_TIME) {
$connection->close();
}
}
});
};
這個定時器內僅僅是純粹的檢測又沒有什么復雜的業(yè)務邏輯,一般不會對服務器造成壓力的;另外根據(jù)路由器節(jié)點防火墻的反空閑超時時間來評估定時頻率推薦最好設置為50秒。