workerman心跳检测必须由应用层主动实现,内核tcp_keepalive不可靠;前端重连需按设备与网络动态退避;onmessage首行必须无条件更新lastmessagetime,无论消息是否解析成功;未绑定uid的匿名连接也须初始化该时间戳;服务端超时阈值须严控在nat防火墙最短超时内(如≤90秒),并区分低功耗与高可靠设备设定不同心跳间隔与容忍阈值。

Workerman 心跳检测必须由应用层主动实现,内核 tcp_keepalive 基本不可靠;前端重连间隔不能固定,得按设备类型和网络环境动态调整。
onMessage 里必须无条件更新 lastMessageTime
很多人只在成功解析业务数据后才写 $connection->lastMessageTime = time(),结果客户端发的 {"type":"ping"} 因 JSON 解析失败被直接 return,时间戳没更新,30 秒后就被误判离线。
- 所有进入
onMessage的原始$msg,第一行就该是$connection->lastMessageTime = time(),不管它是不是 JSON、有没有字段、能不能 decode - 若需区分心跳与业务消息,建议用二进制前缀(如
\x01)或 WebSocketsubprotocol,避免依赖 JSON 结构 - 匿名连接(未调
$connection->bindUid())也要初始化lastMessageTime,否则定时器遍历时触发 PHP Notice
服务端超时阈值必须严控在 NAT 防火墙最短超时之下
运营商级 NAT/4G 基站防火墙普遍在 60~120 秒内静默回收空闲连接,Linux 内核默认 net.ipv4.tcp_keepalive_time=7200 完全无效。
PigX UI Pro 前端开发指南 - Vue 3 + TypeScript + Element Plus。当用户提到 PigX UI、PigX 前端、lgb-mgui 项目、Vue 3 企业级后台开发、Element Plus 后台开发时使用此技能。
- 心跳间隔建议 ≤45 秒(客户端发 ping),服务端检查阈值设为 ≤90 秒(即允许丢一次心跳)
- 农业传感器等低功耗设备:心跳间隔 90 秒,服务端超时检查设为 150 秒(容忍单次丢包)
- 远程控制终端类设备:心跳间隔 25 秒,服务端超时设为 75 秒,并配合客户端三次探测 + 指数退避
- 绝对禁止设成 5 秒——多数 4G 模组 AT 固件不支持高频心跳,反而导致模块卡死或流量暴增
前端重连不能用固定秒数,要分场景退避
固定 3 秒重连在弱网下会引发雪崩式重连请求,且无法应对模组冷启动、SIM 卡重注册等真实延迟。
- 首次断线:立即重试(
ws.close()后立刻 new WebSocket) - 连续失败 2 次:退避至 3~5 秒,加随机抖动(±1 秒)防同步冲击
- 连续失败 5 次:升至 15~30 秒,同时检查
navigator.onLine和信号强度(如modem.getSignalLevel()) - 4G 模组务必监听 AT 响应(如
+CGATT: 1、+CREG: 1,1),只有注册成功后再建 WS 连接,否则重连全是空转
真正难的不是写定时器,而是把心跳逻辑嵌进每个数据入口点,以及让前端重连策略理解模组真实的网络生命周期——比如 SIM 卡附着可能耗时 8 秒,这期间任何重连都是徒劳。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!









