Workerman心跳超时时间必须严格大于检测间隔,推荐Web端设45秒、弱网设75秒、内网设15秒;禁用≤20秒、60秒整数倍及与客户端ping间隔相等的值。

Workerman主动推送信息时,客户端心跳超时时间设置不合理会导致连接频繁断开或假死连接长期滞留,直接影响消息送达率和服务器资源占用。
心跳超时时间与检测间隔的配合逻辑
超时时间不是孤立参数,它必须和定时检测频率协同设定。例如:若检测间隔设为1秒,但超时时间只设10秒,那么最多存在1秒误差;若检测间隔拉长到5秒,同样10秒超时就可能让失效连接多存活近5秒。
【超时时间必须严格大于检测间隔】,否则会出现“刚判定超时→立刻又检测→再次判定超时”的无效循环,徒增CPU开销。
检测间隔通常固定为1秒(Workerman Timer::add(1, ...)最稳妥),此时超时时间应至少设为30秒起。
常见业务场景下的推荐值
方法一:通用Web端实时通知(如订单提醒、IM消息)
设 HEARTBEAT_TIME = 45 秒,客户端每30秒发一次ping,服务端1秒检测一次,45秒未收到任何数据即断开。这个值能覆盖绝大多数家庭宽带/NAT网关的60秒超时阈值,留出15秒缓冲余量,避免误杀。
方法二:移动端弱网环境(4G/地铁WiFi切换频繁)
设 HEARTBEAT_TIME = 75 秒,客户端ping间隔放宽至50秒,并在onMessage中不只更新lastMessageTime,还要重置一个临时心跳计数器(如$connection->missed_pings = 0),连续2次未收到ping才触发close。这样可容忍单次网络抖动丢包。
方法三:内网高可靠系统(如工控设备直连)
设 HEARTBEAT_TIME = 15 秒,检测间隔仍为1秒。因链路稳定,可激进清理异常连接,防止僵尸连接堆积。注意:此值不可用于公网部署,否则大量用户会因瞬时延迟被踢下线。
必须避开的危险数值
第一步:绝对不要将超时时间设为 ≤20 秒
公网环境下,TCP三次握手+SSL协商+跨运营商路由波动,单次请求耗时轻松突破10秒。设20秒等于默认放弃所有边缘用户。
第二步:禁止使用60秒整数倍(如60、120)作为超时值
某些企业级防火墙(如深信服、H3C)对“整分钟空闲连接”有特殊扫描策略,恰好卡在60秒时容易被主动RST掉,导致服务端close调用失败,连接状态错乱。
第三步:不能把客户端ping间隔和服务端超时时间设成相等值
比如客户端每30秒发一次ping,服务端也设30秒超时——网络延迟200ms时,第30秒的ping可能在30.2秒才到达,服务端已在30.0秒判定超时并执行close,造成连接中断。务必留出≥10秒差值。

















