// 心跳间隔 $gateway->pingInterval = 20;
// 心跳无回应次数 $gateway->pingNotResponseLimit = 0;
start_gateway中设置了20秒发一次心跳包,但客户端基本都是40秒左右才收到心跳包?
手册有说明这个现象。 http://www.workerman.net/gatewaydoc/gateway-worker-development/heartbeat.html
所有连接共享同一个心跳周期(Gateway::$pingInterval秒),心跳周期结束那一刻,服务端会检查所有客户端连接,如果连接在该心跳周期内有向服务端发送数据(包括客户端回应给服务端的心跳包),则不发送心跳。如果心跳周期内客户端没发过来数据,则发送心跳给客户端。服务端紧接着进入下一个心跳周期。 如果客户端有回应心跳包,那么根据这个心跳周期机制,服务端会每两个心跳周期(2* Gateway::$pingInterval秒)才发送一次心跳。因为服务端会收到客户端心跳响应包,收到心跳响应包的心跳周期将不会发送心跳,下一个心跳周期才会发送心跳。
所有连接共享同一个心跳周期(Gateway::$pingInterval秒),心跳周期结束那一刻,服务端会检查所有客户端连接,如果连接在该心跳周期内有向服务端发送数据(包括客户端回应给服务端的心跳包),则不发送心跳。如果心跳周期内客户端没发过来数据,则发送心跳给客户端。服务端紧接着进入下一个心跳周期。
如果客户端有回应心跳包,那么根据这个心跳周期机制,服务端会每两个心跳周期(2* Gateway::$pingInterval秒)才发送一次心跳。因为服务端会收到客户端心跳响应包,收到心跳响应包的心跳周期将不会发送心跳,下一个心跳周期才会发送心跳。
以上摘自手册。 简单的理解就是服务端收到客户端的数据了,服务端已经知道客户端还在,那么20秒内没必要再发心跳去询问了,所以下次心跳会在第二个心跳周期发,也就是大概40秒的时间间隔
手册有说明这个现象。
http://www.workerman.net/gatewaydoc/gateway-worker-development/heartbeat.html
以上摘自手册。
简单的理解就是服务端收到客户端的数据了,服务端已经知道客户端还在,那么20秒内没必要再发心跳去询问了,所以下次心跳会在第二个心跳周期发,也就是大概40秒的时间间隔