/* 任何程式碼 */
$linger = array ('l_linger' => 0, 'l_onoff' => 1);
socket_set_option($socket, SOL_SOCKET, SO_LINGER, $linger);
socket_close($sock);
這是強制關閉通訊端連線的程式碼。
無回傳值。
/* 任何程式碼 */
$linger = array ('l_linger' => 0, 'l_onoff' => 1);
socket_set_option($socket, SOL_SOCKET, SO_LINGER, $linger);
socket_close($sock);
這是強制關閉通訊端連線的程式碼。
PHP: 5.1.4
摘要:close() 不會立即釋放通訊端。
使用 BSD 通訊端實作(PHP 使用的通訊端介面),socket_close() 可以關閉通訊端,但可能還有資料要傳送。在資料傳送完成之前,連接埠將無法使用。因此,由於「連接埠無法重複使用」(大致上的訊息)錯誤,所有嘗試在該連接埠上進行的進一步綁定都將無法接受。通常,如果設定了 REUSABLE 通訊端選項,唯一會引發此類錯誤的是綁定到已綁定的特定 IP/PORT 組合。
為了避免這個問題,您必須告知它延遲返回,直到連接埠傳送完其餘資料或逾時。這是透過 SO_LINGER 選項完成的。要設定此選項,需要一個包含兩個元素的陣列:第一個元素指示在關閉完成之前是否需要在任何資料上逗留,第二個元素指示我們是否實際逗留。如果我們將第一個元素設定為非零值,同時將第二個元素設定為零,我們將簡單地捨棄緩衝區中等待的任何資料,並關閉通訊端。要告知它只是等待資料傳送,您可以將兩者都傳送非零值:array(1, 1)。
請注意,如果您已指示不要阻塞 (socket_set_nonblock()),它將簡單地退出,無論如何,就像通常一樣。在這種情況下,它會爆發一個 EWOULDWAIT 旗標,但我認為我們在 PHP 中無法存取這些通訊端旗標,因此應該在設定逗留和退出之前重新啟用阻塞。
// 這些指令會直接傳遞給 Unix socket 函式庫。這就是為什麼它們的風格比較像 C 語言。
$arrOpt = array('l_onoff' => 1, 'l_linger' => 1);
socket_set_block($this->Socket);
socket_set_option($this->Socket, SOL_SOCKET, SO_LINGER, $arrOpt);
socket_close($this->Socket);