PHP Conference Japan 2024

stream_socket_shutdown

(PHP 5 >= 5.2.1, PHP 7, PHP 8)

stream_socket_shutdown關閉全雙工連線

說明

stream_socket_shutdown(資源 $stream, int $mode): bool

關閉(部分或全部)全雙工連線。

注意:

關聯的緩衝區可能會或可能不會被清空。

參數

stream

一個開啟的串流(例如,使用 stream_socket_client() 開啟)

mode

下列其中一個常數:STREAM_SHUT_RD(停用進一步接收)、STREAM_SHUT_WR(停用進一步傳輸)或 STREAM_SHUT_RDWR(停用進一步接收和傳輸)。

返回值

成功時返回 true,失敗時返回 false

範例

範例 #1 stream_socket_shutdown() 範例

<?php

$server
= stream_socket_server('tcp://127.0.0.1:1337');
$client = stream_socket_client('tcp://127.0.0.1:1337');

var_dump(fputs($client, "hello"));

stream_socket_shutdown($client, STREAM_SHUT_WR);
var_dump(fputs($client, "hello")); // 現在無法運作

?>

上述範例會輸出類似以下的內容

int(5)

Notice: fputs(): send of 5 bytes failed with errno=32 Broken pipe in test.php on line 9
int(0)

參見

  • fclose() - 關閉開啟的檔案指標

新增註解

使用者貢獻的註解 3 則註解

Daniel J
3 年前
在 TLS socket 上使用 stream_socket_shutdown 時要小心。socket 會在沒有發送 TLS 協定所需的「close_notify」訊息的情況下關閉。

要正確關閉 TLS socket,請改用 fclose(),它會在內部呼叫 OpenSSL 的 SSL_shutdown() 函式。
匿名
3 年前
正如 Daniel J 指出的,stream_socket_shutdown 不會發送 TLS close_notify 訊息。在某些情況下,它是比 fclose 更佳的函式(例如,觸發 stream_select)。

要將此函式與 TLS 正確搭配使用,請在關閉 socket 之前使用 stream_socket_enable_crypto($fp, false);。
jgotti
12 年前
只是要提醒一下,如果您在多客戶端伺服器中使用 fclose 關閉某些 socket 時遇到問題,您真的應該試試這個函式。

花了一整天嘗試使用 stream_socket_shutdown($clientStream,STREAM_SHUT_RDWR); 解決這個問題。
最終成功了。
To Top