正常情況下客戶端中斷TCP連線時,會傳送一個FIN包,進行4次斷開握手來通知伺服器。但在某些異常情況下,例如客戶端突然斷電斷網或網路異常,伺服器可能無法得知客戶端已斷開連線。
尤其是行動網絡,TCP連線非常不穩定,所以需要一套機制來確保伺服器和客戶端之間連線的有效性。
Swoole擴充功能本身內建了這個機制,開發者只需要配置一個參數即可啟用。 Swoole在每次收到客戶端資料會記錄一個時間戳,當客戶端在一定時間內未向伺服器端發送數據,那伺服器會自動切斷連線。 (建議學習: swoole影片教學)
使用方法:
$serv->set(array( 'heartbeat_check_interval' => 5, 'heartbeat_idle_time' => 10, ));
上面的設定就是每5秒偵測一次心跳,一個TCP連線如果在10秒內未向伺服器端發送數據,將會被切斷。
進階用法:
使用swoole_server::heartbeat()函式手動偵測心跳是否到期。此函數會傳回閒置時間超過heartbeat_idle_time的所有TCP連線。程式中可以將這些連線做一些操作,例如發送資料或關閉連線。
以上是swoole怎麼保持不斷線的詳細內容。更多資訊請關注PHP中文網其他相關文章!