<?php
require_once __DIR__ . '/workerman/workerman/Autoloader.php';
use Workerman\Worker;
use Workerman\Lib\Timer;
// 心跳间隔20秒
define('HEARTBEAT_TIME', 20);
$worker = new Worker('websocket://0.0.0.0:2345');
// 接受数据时
$worker->onMessage = function($connection, $msg) {
$connection->lastMessageTime = time();
if ($msg == 'ping') {
$connection->send('pong');
}
};
// worker进程启动时
$worker->onWorkerStart = function($worker) {
Timer::add(1, function()use($worker){
$time_now = time();
foreach($worker->connections as $connection) {
// 有可能该connection还没收到过消息,则lastMessageTime设置为当前时间
if (empty($connection->lastMessageTime)) {
$connection->lastMessageTime = $time_now;
continue;
}
// 上次通讯时间间隔大于心跳间隔,则认为客户端已经下线,关闭连接
if ($time_now - $connection->lastMessageTime > HEARTBEAT_TIME) {
$connection->close('超过设定时间未连接');
}
}
});
};
Worker::runAll();
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交