如題,單用workerman,如何實(shí)現(xiàn)gateway的心跳? 客戶端可以做成定時(shí)發(fā)包,但是意外掉線時(shí),服務(wù)器可能不會(huì)及時(shí)的收到通知。
<?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) {
// 給鏈接對(duì)象臨時(shí)賦值一個(gè)lastTime屬性記錄上次接收消息的時(shí)間
$connection->lastTime = time();
};
$worker->onWorkerStart = function($worker) {
// 每秒檢查一次所有鏈接是否心跳超時(shí)
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ù)的時(shí)間
$connection->lastTime = time();
$connection->send($data);
};
Worker::runAll();
上面是定時(shí)檢查所有鏈接心跳超時(shí)。也可以給每個(gè)鏈接設(shè)置定時(shí)器,檢查心跳超時(shí)。