PHP Conference Japan 2024

socket_close

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

socket_close關閉 Socket 實例

說明

socket_close(Socket $socket): void

socket_close() 關閉由 socket 指定的 Socket 實例。

參數

socket

使用 socket_create()socket_accept() 建立的 Socket 實例。

回傳值

無回傳值。

更新日誌

版本 說明
8.0.0 socket 現在是一個 Socket 實例;以前它是一個 資源

參見

新增筆記

使用者貢獻的筆記 2 則筆記

yaBliznyk at gmail dot com
7 年前
/* 任何程式碼 */
$linger = array ('l_linger' => 0, 'l_onoff' => 1);
socket_set_option($socket, SOL_SOCKET, SO_LINGER, $linger);
socket_close($sock);

這是強制關閉通訊端連線的程式碼。
aeolianmeson at NOSPAM dot blitzeclipse dot com
18 年前
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);
To Top