php socket 心跳机制,socket学习纪录2: workerman 心跳功能实现
心跳及作用
所谓心跳,就是客户端每隔一段时间向服务端发送一段任意的数据,证明客户端还在。
长连接应用必须加心跳,否则连接可能由于长时间未通讯被路由节点强行断开。
心跳作用主要有两个:
1、客户端定时给服务端发送点数据,防止连接由于长时间没有通讯而被某些节点的防火墙关闭导致连接断开的情况。
2、服务端可以通过心跳来判断客户端是否在线,如果客户端在规定时间内没有发来任何数据,就认为客户端下线。这样可以检测到客户端由于极端情况(断电、断网等)下线的事件。
建议值:建议心跳间隔小于60秒
实现方式服务端:
在onWorkerStart回调中,设置定时器,每隔1s钟,检查每隔connection的上次数据接收时间lastMessageTime,如果lastMessageTime距离本次检测超过心跳间隔(如10s),则认为该connection断开了链接,触发connection的close回调
在接收新消息回调onMessage中,设置该connection的lastMessageTime为当前时间
客户端:通过设置定时任务setInterval,每隔一段时间发送一段数据,时间间隔小于服务器间隔,以免因为网络延迟造成心跳未及时接收,比如8s发送一次
代码实现
服务端代码<?php
require_once __DIR__ . '/Workerman/Autoloader.php';
use Workerman\Worker;
use Workerman\Lib\Timer;
// 心跳间隔25秒
define('HEARTBEAT_TIME', 25);
$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();
小程序端代码wx.onSocketOpen(function (res) {
console.log('WebSocket连接已打开!')
wx.sendSocketMessage({
data: "大家好",
})
setInterval(function(){
wx.sendSocketMessage({
data: "心跳",
})
},8000)
})
php socket 心跳机制,socket学习纪录2: workerman 心跳功能实现相关推荐
- java udp心跳机制,Socket心跳包机制总结
跳包之所以叫心跳包是因为:它像心跳一样每隔固定时间发一次,以此来告诉服务器,这个客户端还活着.事实上这是为了保持长连接,至于这个包的内容,是没有什么特别规定的,不过一般都是很小的包,或者只包含包头的一 ...
- java心跳机制_Java: server/client 心跳机制实现 示例
心跳机制 心跳机制是定时发送一个自定义的结构体(心跳包),让对方知道自己还活着,以确保连接的有效性的机制. 大部分CS的应用需要心跳机制.心跳机制一般在Server和Client都要实现,两者实现原理 ...
- LWIP应用开发|心跳机制
心跳机制 1. 心跳机制简介 在长连接下,可能很长一段时间都没有数据往来.理论上说,这个连接是一直保持连接的,但是实际情况中,如果中间节点出现什么故障是难以知道的.更致命的是,有的节点(防火墙)会自动 ...
- 长连接 、短连接、心跳机制与断线重连
在不同场景下要考虑长连接还是短连接,那么我们要先了解他. 短连接 概念 client与server通过三次握手建立连接,client发送请求消息,server返回响应,一次连接就完成了. 这时候双方任 ...
- 【MQTT基础篇(十四)】MQTT心跳机制
文章目录 MQTT心跳机制 MQTT心跳机制 在医院里,医生利用心跳来判断患者是否还有生命体征.对于MQTT服务器来说,它要判断一台MQTT客户端是否依然保持连接可以检查这台客户端是不是经常发送消息给 ...
- hadoop之MapReduce框架TaskTracker端心跳机制分析(源码分析第六篇)
1.概述 MapReduce框架中的master/slave心跳机制是整个集群运作的基础,是沟通TaskTracker和JobTracker的桥梁.TaskTracker周期性地调用心跳RPC函数,汇 ...
- Kafka 心跳机制 重复消费
kafka 心跳机制 Kafka是通过心跳机制来控制消费超时,心跳机制对于消费者客户端来说是无感的,它是一个异步线程,当我们启动一个消费者实例时,心跳线程就开始工作了.心跳超时会导致消息重复消费. 在 ...
- MQTT心跳机制介绍
在医院里,医生利用心跳来判断患者是否还有生命体征.对于MQTT服务器来说,它要判断一台MQTT客户端是否依然保持连接可以检查这台客户端是不是经常发送消息给服务端.如果经常收到客户端的消息,那么没问题, ...
- netty之心跳机制
目录 一.前言 二.netty的心跳工具 三.IdleStatehandler 1.构造方法 2.handlerAdded 3.定时任务 4.读事件空闲 5.写事件空闲 一.前言 心跳机制就是定时的给 ...
最新文章
- Python基础02-Python基础
- 职场新人成功修炼五诀 迅速在职场占一席之地
- MyBatis-13MyBatis动态SQL之【where、set、trim】
- 漫游Kafka设计篇之消息传输的事务定义
- (cljs/run-at (JSVM. :all) 一次说白DataType、Record和Protocol)
- .net去除html标签代码
- day1作业:登录接口
- 酒精测试仪检定设备设计与验证
- 两个linux系统拷贝文件,两台linux文件拷贝
- robots.txt限制些什么屏蔽内容与安全性的考虑
- 关于readonly修饰符
- 清华大学计算机考研总结,2020考研清华大学计算机考研考试科目总结
- 入门Python,胶水语言的优势和困扰
- 顺丰该不该开除删库的运维工程师?
- 利用接口检查日期是否为法定节假日
- java apache 日志_了解Apache的访问日志
- canal1.1.5 配置kaka
- 【非原创】完全用Linux工作(下)(r4笔记第86天)
- 数字工厂生产监控可视化决策平台,打造智能制造新时代
- 第一天使用 csdn