Php心跳监听,workerman心跳怎么用

本文介绍了Workerman框架中如何实现心跳检测机制,以确保长连接在客户端出现极端情况(如断电、网络故障)时能及时发现并断开连接。通过设置心跳间隔为55秒,服务端可以监测到超过这个时间未收到来自客户端的数据,从而关闭连接。心跳检测不仅防止了因长时间无通讯导致的连接被防火墙关闭,还提供了客户端在线状态的判断依据。
摘要由CSDN通过智能技术生成

465a2316f71dc7b8f886c1045e6bd2a5.png

Gateway/Worker开发模型支持服务端的心跳检测,可以定时向客户端发送应用层的心跳,能够及时检测到客户端极端掉线情况(掉电、突发网络故障等)。

注意:长连接应用必须加心跳,否则连接可能由于长时间未通讯被路由节点强行断开。 (推荐学习:workerman教程)

心跳作用主要有两个:

1、客户端定时给服务端发送点数据,防止连接由于长时间没有通讯而被某些节点的防火墙关闭导致连接断开的情况。

2、服务端可以通过心跳来判断客户端是否在线,如果客户端在规定时间内没有发来任何数据,就认为客户端下线。这样可以检测到客户端由于极端情况(断电、断网等)下线的事件。

心跳间隔建议值:

建议客户端发送心跳间隔小于60秒,比如55秒。

示例:<?php

require_once __DIR__ . '/Workerman/Autoloader.php';

use Workerman\Worker;

use Workerman\Lib\Timer;

// 心跳间隔55秒

define('HEARTBEAT_TIME', 55);

$worker = new Worker('text://0.0.0.0:1234');

$worker->onMessage = function($connection, $msg) {

// 给connection临时设置一个lastMessageTime属性,用来记录上次收到消息的时间

$connection->lastMessageTime = time();

// 其它业务逻辑...

};

// 进程启动后设置一个每秒运行一次的定时器

$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();

以上配置为如果客户端超过55秒没有发送任何数据给服务端,则服务端认为客户端已经掉线,服务端关闭连接并触发onClose。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值