對於那些想要使用 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);
?>
(PHP 5, PHP 7, PHP 8)
stream_socket_client — 開啟網際網路或 Unix 網域通訊端連線
$address
,&$error_code
= null
,&$error_message
= null
,$timeout
= null
,$flags
= STREAM_CLIENT_CONNECT
,$context
= null
初始化一個串流或資料包連線到由 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_CONNECT
和 STREAM_CLIENT_PERSISTENT
。
context
使用 stream_context_create() 建立的有效上下文資源。
如果連線失敗,error_code
和 error_message
參數將會填入系統層級 connect()
呼叫中發生的實際系統層級錯誤。如果 error_code
中返回的值為 0
且函式返回 false
,則表示錯誤發生在 connect()
呼叫之前。這很可能是由於初始化通訊端時發生問題所致。請注意,error_code
和 error_message
參數將一律以傳址方式傳遞。
版本 | 說明 |
---|---|
8.0.0 |
timeout 和 context 現在可以為 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() 取得可用傳輸方式的清單。有關內建傳輸方式的清單,請參閱 支援的通訊端傳輸方式清單。
對於那些想要使用 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);
?>
`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() 遵循類似的模式,但它沒有這個特殊的功能。