// 心跳間隔
$gateway->pingInterval = 20;
// 心跳無回應(yīng)次數(shù)
$gateway->pingNotResponseLimit = 0;
start_gateway中設(shè)置了20秒發(fā)一次心跳包,但客戶端基本都是40秒左右才收到心跳包?
手冊有說明這個(gè)現(xiàn)象。
http://wtbis.cn/gatewaydoc/gateway-worker-development/heartbeat.html
所有連接共享同一個(gè)心跳周期(Gateway::$pingInterval秒),心跳周期結(jié)束那一刻,服務(wù)端會(huì)檢查所有客戶端連接,如果連接在該心跳周期內(nèi)有向服務(wù)端發(fā)送數(shù)據(jù)(包括客戶端回應(yīng)給服務(wù)端的心跳包),則不發(fā)送心跳。如果心跳周期內(nèi)客戶端沒發(fā)過來數(shù)據(jù),則發(fā)送心跳給客戶端。服務(wù)端緊接著進(jìn)入下一個(gè)心跳周期。
如果客戶端有回應(yīng)心跳包,那么根據(jù)這個(gè)心跳周期機(jī)制,服務(wù)端會(huì)每兩個(gè)心跳周期(2* Gateway::$pingInterval秒)才發(fā)送一次心跳。因?yàn)榉?wù)端會(huì)收到客戶端心跳響應(yīng)包,收到心跳響應(yīng)包的心跳周期將不會(huì)發(fā)送心跳,下一個(gè)心跳周期才會(huì)發(fā)送心跳。
以上摘自手冊。
簡單的理解就是服務(wù)端收到客戶端的數(shù)據(jù)了,服務(wù)端已經(jīng)知道客戶端還在,那么20秒內(nèi)沒必要再發(fā)心跳去詢問了,所以下次心跳會(huì)在第二個(gè)心跳周期發(fā),也就是大概40秒的時(shí)間間隔