以下代碼是心跳的demo
假如開了4個(gè)進(jìn)程,豈不是每個(gè)進(jìn)程都會(huì)每隔10秒輪詢檢測(cè)一次是否超時(shí)?
這樣操作是不是太頻繁了?
如果指定某個(gè)進(jìn)程輪詢,其他進(jìn)程的連接又檢測(cè)不到
==========
// 進(jìn)程啟動(dòng)后設(shè)置一個(gè)每10秒運(yùn)行一次的定時(shí)器
$worker->onWorkerStart = function($worker) {
Timer::add(10, function()use($worker){
$time_now = time();
foreach($worker->connections as $connection) {
// 有可能該connection還沒收到過消息,則lastMessageTime設(shè)置為當(dāng)前時(shí)間
if (empty($connection->lastMessageTime)) {
$connection->lastMessageTime = $time_now;
continue;
}
// 上次通訊時(shí)間間隔大于心跳間隔,則認(rèn)為客戶端已經(jīng)下線,關(guān)閉連接
if ($time_now - $connection->lastMessageTime > HEARTBEAT_TIME) {
$connection->close();
}
}
});
};
這個(gè)定時(shí)器內(nèi)僅僅是純粹的檢測(cè)又沒有什么復(fù)雜的業(yè)務(wù)邏輯,一般不會(huì)對(duì)服務(wù)器造成壓力的;另外根據(jù)路由器節(jié)點(diǎn)防火墻的反空閑超時(shí)時(shí)間來評(píng)估定時(shí)頻率推薦最好設(shè)置為50秒。