如題,單用workerman,如何實現(xiàn)gateway的心跳? 客戶端可以做成定時發(fā)包,但是意外掉線時,服務(wù)器可能不會及時的收到通知。
<?php
require_once __DIR__ . '/Workerman/Autoloader.php';
use Workerman\Worker;
use Workerman\WebServer;
use Workerman\Lib\Timer;
define('PING_TIMEOUT', 5);
$worker = new Worker('tcp://0.0.0.0:12345');
$worker->onConnect = function($connection) {
// 給鏈接對象臨時賦值一個lastTime屬性記錄上次接收消息的時間
$connection->lastTime = time();
};
$worker->onWorkerStart = function($worker) {
// 每秒檢查一次所有鏈接是否心跳超時
Timer::add(1, function()use($worker) {
$time_now = time();
foreach($worker->connections as $connection) {
if($time_now - $connection->lastTime > PING_TIMEOUT) {
$connection->close('ping timeout and close');
}
}
});
};
$worker->onMessage = function($connection, $data) {
// 記錄本次客戶端發(fā)來數(shù)據(jù)的時間
$connection->lastTime = time();
$connection->send($data);
};
Worker::runAll();
上面是定時檢查所有鏈接心跳超時。也可以給每個鏈接設(shè)置定時器,檢查心跳超時。