正常的情況用戶端斷開連線會傳送到服務端給服務端一個fin包,服務端收到fin包後得知客戶端連線斷開,立刻觸發onClose事件回呼。
但有些極端狀況如客戶端掉電、網路關閉、拔網路線、路由故障等,這些極端狀況用戶端無法傳送fin包給服務端,服務端便無法知道連線已經中斷。如果客戶端與服務端定時有心跳資料傳輸,則會比較及時的發現連線斷開,觸發onClose事件回呼。
另外路由節點防火牆會關閉長時間不通訊的socket連接,導致socket長連線中斷。所以需要客戶端與服務端定時發送心跳資料保持連線不被斷開。
GatewayWorker中如何設定心跳偵測?
目前GatewayWorker支援兩種心跳偵測,服務端設定多少秒內沒收到心跳關閉連線(建議),同時也支援服務端定時向客戶端傳送心跳資料(不建議)。
客戶端定時發送心跳(建議)
客戶端定時(間隔最好小於60秒)向服務端發送心跳。服務端類似以下設定:
$gateway = new Gateway("Websocket://0.0.0.0:8585"); $gateway->pingInterval = 55; $gateway->pingNotResponseLimit = 1; $gateway->pingData = '';
以上設定意義是客戶端連線 pingInterval*pingNotResponseLimit=55 秒內沒有任何請求則服務端認為對應客戶端已經斷線,服務端關閉連線並觸發onClose回呼。
更多workerman知識請關注workerman教學專欄。
以上是workerman如何保持連接的詳細內容。更多資訊請關注PHP中文網其他相關文章!