PHP Conference Japan 2024

socket_create_pair

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

socket_create_pair建立一對不可區分的 socket 並將它們儲存在陣列中

說明

socket_create_pair(
    int $domain,
    int $type,
    int $protocol,
    array &$pair
): bool

socket_create_pair() 建立兩個已連線且不可區分的 socket,並將它們儲存在 pair 中。此函式通常用於 IPC(行程間通訊)。

參數

domain

domain 參數指定 socket 要使用的協定系列。完整列表請參閱 socket_create()

type

參數 type 選擇通訊端要使用的通訊類型。完整的列表請參考 socket_create()

protocol(協定)

參數 protocol 設定在指定的 domain 中,於返回的通訊端上進行通訊時所使用的特定協定。正確的值可以使用 getprotobyname() 透過名稱取得。如果所需的協定是 TCP 或 UDP,也可以使用對應的常數 SOL_TCPSOL_UDP

關於支援的協定完整列表,請參考 socket_create()

pair(配對)

一個陣列的參考,兩個 Socket 實例將會被插入此陣列。

返回值

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

更新日誌

版本 說明
8.0.0 pair 現在是指向 Socket 實例陣列的參考;之前,它是指向 resource 陣列的參考。

範例

範例 #1 socket_create_pair() 範例

<?php
$sockets
= array();

/* 在 Windows 系統上,我們需要使用 AF_INET */
$domain = (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN' ? AF_INET : AF_UNIX);

/* 設定 Socket 配對 */
if (socket_create_pair($domain, SOCK_STREAM, 0, $sockets) === false) {
echo
"socket_create_pair 失敗。原因: ".socket_strerror(socket_last_error());
}
/* 傳送和接收資料 */
if (socket_write($sockets[0], "ABCdef123\n", strlen("ABCdef123\n")) === false) {
echo
"socket_write() 失敗。原因: ".socket_strerror(socket_last_error($sockets[0]));
}
if ((
$data = socket_read($sockets[1], strlen("ABCdef123\n"), PHP_BINARY_READ)) === false) {
echo
"socket_read() 失敗。原因: ".socket_strerror(socket_last_error($sockets[1]));
}
var_dump($data);

/* 關閉 Sockets */
socket_close($sockets[0]);
socket_close($sockets[1]);
?>

範例 #2 socket_create_pair() IPC 範例

<?php
$ary
= array();
$strone = 'Message From Parent.';
$strtwo = 'Message From Child.';

if (
socket_create_pair(AF_UNIX, SOCK_STREAM, 0, $ary) === false) {
echo
"socket_create_pair() failed. Reason: ".socket_strerror(socket_last_error());
}
$pid = pcntl_fork();
if (
$pid == -1) {
echo
'Could not fork Process.';
} elseif (
$pid) {
/*parent*/
socket_close($ary[0]);
if (
socket_write($ary[1], $strone, strlen($strone)) === false) {
echo
"socket_write() failed. Reason: ".socket_strerror(socket_last_error($ary[1]));
}
if (
socket_read($ary[1], strlen($strtwo), PHP_BINARY_READ) == $strtwo) {
echo
"Received $strtwo\n";
}
socket_close($ary[1]);
} else {
/*child*/
socket_close($ary[1]);
if (
socket_write($ary[0], $strtwo, strlen($strtwo)) === false) {
echo
"socket_write() failed. Reason: ".socket_strerror(socket_last_error($ary[0]));
}
if (
socket_read($ary[0], strlen($strone), PHP_BINARY_READ) == $strone) {
echo
"Received $strone\n";
}
socket_close($ary[0]);
}
?>

參見

新增註解

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

3
cweiske at php dot net
15 年前
底層的 sockpair() 函式至少在 BSD 和 Linux 上僅支援 AF_UNIX。
To Top