PHP Conference Japan 2024

stream_socket_client

(PHP 5, PHP 7, PHP 8)

stream_socket_client開啟網際網路或 Unix 網域通訊端連線

說明

stream_socket_client(
    字串 $address,
    整數 &$error_code = null,
    字串 &$error_message = null,
    ?浮點數 $timeout = null,
    整數 $flags = STREAM_CLIENT_CONNECT,
    ?資源 $context = null
): 資源|false

初始化一個串流或資料包連線到由 address 指定的目的地。建立的socket類型由使用標準URL格式指定的傳輸方式決定:transport://target。對於網際網路網域socket (AF_INET),例如TCP和UDP,address 參數的 target 部分應包含主機名稱或IP地址,後跟冒號和埠號。對於Unix網域socket,target 部分應指向檔案系統上的socket檔案。

注意事項:

預設情況下,串流將以阻塞模式開啟。您可以使用 stream_set_blocking() 將其切換為非阻塞模式。

參數

address

要連線的socket地址。

error_code

如果連線失敗,將被設定為系統層級錯誤號。

error_message

如果連線失敗,將被設定為系統層級錯誤訊息。

timeout

connect() 系統呼叫應該逾時的秒數。預設情況下,使用 default_socket_timeout

注意此參數僅適用於非非同步連線嘗試的情況。

注意事項:

要設定讀取/寫入socket資料的逾時,請使用 stream_set_timeout(),因為 timeout 僅適用於連線socket時。

flags

位元遮罩欄位,可以設定為任何連線旗標的組合。目前連線旗標的選擇僅限於 STREAM_CLIENT_CONNECT(預設)、STREAM_CLIENT_ASYNC_CONNECTSTREAM_CLIENT_PERSISTENT

context

使用 stream_context_create() 建立的有效上下文資源。

返回值

成功時,返回一個串流資源,可以與其他檔案函數一起使用(例如 fgets()fgetss()fwrite()fclose()feof()),失敗時返回 false

錯誤/例外

如果連線失敗,error_codeerror_message 參數將會填入系統層級 connect() 呼叫中發生的實際系統層級錯誤。如果 error_code 中返回的值為 0 且函式返回 false,則表示錯誤發生在 connect() 呼叫之前。這很可能是由於初始化通訊端時發生問題所致。請注意,error_codeerror_message 參數將一律以傳址方式傳遞。

更新日誌

版本 說明
8.0.0 timeoutcontext 現在可以為 null。

範例

範例 #1 stream_socket_client() 範例

<?php
$fp
= stream_socket_client("tcp://www.example.com:80", $errno, $errstr, 30);
if (!
$fp) {
echo
"$errstr ($errno)<br />\n";
} else {
fwrite($fp, "GET / HTTP/1.0\r\nHost: www.example.com\r\nAccept: */*\r\n\r\n");
while (!
feof($fp)) {
echo
fgets($fp, 1024);
}
fclose($fp);
}
?>

範例 #2 使用 UDP 連線

從本機主機上的 UDP 服務「daytime」(連接埠 13)擷取日期和時間。

<?php
$fp
= stream_socket_client("udp://127.0.0.1:13", $errno, $errstr);
if (!
$fp) {
echo
"錯誤: $errno - $errstr<br />\n";
} else {
fwrite($fp, "\n");
echo
fread($fp, 26);
fclose($fp);
}
?>

注意事項

警告

即使遠端主機無法連線,UDP 通訊端有時也會看似已開啟且沒有錯誤。只有在您從通訊端讀取或寫入資料時,錯誤才會顯現。這是因為 UDP 是一種「無連線」協定,這表示作業系統在實際需要傳送或接收資料之前,不會嘗試建立通訊端的連結。

注意指定數值 IPv6 位址(例如 fe80::1)時,必須將 IP 位址以方括號括起來 — 例如,tcp://[fe80::1]:80

注意事項:

根據環境的不同,Unix 網域或選用的連線逾時可能無法使用。可以使用 stream_get_transports() 取得可用傳輸方式的清單。有關內建傳輸方式的清單,請參閱 支援的通訊端傳輸方式清單

另請參閱

新增註釋

使用者貢獻的註釋 2 則註釋

22
nicholas at nicholaswilliams dot net
16 年前
對於那些想要使用 stream_socket_client() 連線到本機 UNIX 通訊端卻找不到相關文件的人,以下是一個(粗略的)範例

<?php

$sock
= stream_socket_client('unix:///full/path/to/my/socket.sock', $errno, $errstr);

fwrite($sock, 'SOME COMMAND'."\r\n");

echo
fread($sock, 4096)."\n";

fclose($sock);

?>
10
Vasil Rangelov a.k.a. boen_robot
13 年前
`remote_socket` 參數,在其結尾部分(更確切地說,在端口號之後),可以包含一個 "/" 後接一個唯一的識別符。如果您想要建立多個持久連線到同一個 `transport://host:port` 組合,這會特別有用。

範例
<?php
$socket
= stream_socket_client('tcp://mysql.example.com:3306/root', $errorno, $errorstr, $timeout, STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT);
?>

請注意,雖然 (p)fsockopen() 遵循類似的模式,但它沒有這個特殊的功能。
To Top