单用workerman,如何实现gateway的心跳?

ivan

如题,单用workerman,如何实现gateway的心跳? 客户端可以做成定时发包,但是意外掉线时,服务器可能不会及时的收到通知。

4208 3 2
3个回答

walkor
<?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();

上面是定时检查所有链接心跳超时。也可以给每个链接设置定时器,检查心跳超时。

  • 暂无评论
ivan

多谢老大!!!^_^

  • 暂无评论
walkor

不客气

  • 暂无评论
年代过于久远,无法发表回答
🔝