定时发心跳包问题

JoeZing

// 心跳间隔
$gateway->pingInterval = 20;

// 心跳无回应次数
$gateway->pingNotResponseLimit = 0;

start_gateway中设置了20秒发一次心跳包,但客户端基本都是40秒左右才收到心跳包?

阅读 6512
1个回答

walkor

手册有说明这个现象。
http://www.workerman.net/gatewaydoc/gateway-worker-development/heartbeat.html

所有连接共享同一个心跳周期(Gateway::$pingInterval秒),心跳周期结束那一刻,服务端会检查所有客户端连接,如果连接在该心跳周期内有向服务端发送数据(包括客户端回应给服务端的心跳包),则不发送心跳。如果心跳周期内客户端没发过来数据,则发送心跳给客户端。服务端紧接着进入下一个心跳周期。

如果客户端有回应心跳包,那么根据这个心跳周期机制,服务端会每两个心跳周期(2* Gateway::$pingInterval秒)才发送一次心跳。因为服务端会收到客户端心跳响应包,收到心跳响应包的心跳周期将不会发送心跳,下一个心跳周期才会发送心跳。

以上摘自手册。
简单的理解就是服务端收到客户端的数据了,服务端已经知道客户端还在,那么20秒内没必要再发心跳去询问了,所以下次心跳会在第二个心跳周期发,也就是大概40秒的时间间隔

  • 暂无评论