如题,单用workerman,如何实现gateway的心跳? 客户端可以做成定时发包,但是意外掉线时,服务器可能不会及时的收到通知。
<?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) { // 记录本次客户端发来数据的时间 $connection->lastTime = time(); $connection->send($data); }; Worker::runAll();
上面是定时检查所有链接心跳超时。也可以给每个链接设置定时器,检查心跳超时。
多谢老大!!!^_^
不客气
上面是定时检查所有链接心跳超时。也可以给每个链接设置定时器,检查心跳超时。
多谢老大!!!^_^
不客气