swoole心跳配置需满足heartbeat_idle_time > heartbeat_check_interval(至少大20秒),并匹配客户端心跳间隔与nginx超时设置,否则连接将被误杀。

没有通用“合适值”,必须根据心跳帧间隔、网络质量、业务容忍度三者共同推算,硬套 60 或 30 秒大概率导致连接被误杀。
heartbeat_idle_time 必须大于 heartbeat_check_interval
这是硬性前提。Swoole 的心跳检测逻辑是:每 heartbeat_check_interval 秒扫描一次所有连接,检查每个连接「最后收包时间」距今是否超过 heartbeat_idle_time。如果 heartbeat_idle_time ≤ heartbeat_check_interval,第一次扫描就可能直接干掉所有连接。
- 错误配置示例:
'heartbeat_idle_time' => 25, 'heartbeat_check_interval' => 30→ 启动即失效 - 正确下限关系:
heartbeat_idle_time至少要比heartbeat_check_interval大 20 秒,留出网络抖动、GC 暂停、协程调度延迟的缓冲
真实场景推荐值(Hyperf 3.x + Swoole 5.x)
生产环境不是调参游戏,得看客户端实际行为。如果你用的是标准 WebSocket(非自定义 JSON ping),且前端每 30 秒发一次 ping 帧:
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
-
heartbeat_check_interval => 25:比客户端心跳间隔略小,确保能及时捕获漏发 -
heartbeat_idle_time => 60:允许最多 30 秒误差(30 秒心跳 + 30 秒容错),覆盖弱网重传、服务端处理延迟 - 若前端用
setInterval(() => ws.send('{"type":"ping"}'), 45000),则heartbeat_idle_time至少设为 90
别忽略 Nginx / LB 层超时级联效应
就算 Swoole 配对了,proxy_read_timeout 小于 heartbeat_idle_time 一样断连。Nginx 会在自己超时后主动关闭与后端的连接,Swoole 根本等不到心跳检测触发。
- 必须同步设置:
proxy_read_timeout 86400(24 小时)或至少90(比heartbeat_idle_time大 15 秒以上) -
proxy_send_timeout也要设成相同值,否则服务端发pong途中被截断,客户端收不到,下次心跳就失败 - 漏掉
proxy_set_header Upgrade $http_upgrade?握手阶段就 400,根本进不了心跳流程
客户端不回标准 PONG,heartbeat_idle_time 形同虚设
Swoole 的心跳检测只认 TCP 层数据到达,不管内容。但它默认不自动响应 ping 帧——它只等你发 pong。如果你前端用原生 WebSocket 对象但没监听 onmessage 处理服务端发来的 ping,或者服务端发的是 {"type":"ping"} 而客户端只认二进制 0x09,那 Swoole 永远收不到有效响应,heartbeat_idle_time 到点就关连接,毫无商量余地。
这个细节最容易被忽略:参数调再稳,只要客户端没按规范回 PONG 帧,Swoole 就当连接已死。不是 Bug,是设计如此。










