底层的 sockpair() 函数至少在 BSD 和 Linux 上只支持 AF_UNIX。
(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)
socket_create_pair — 创建一对无法区分的套接字并将它们存储在数组中
socket_create_pair() 创建两个连接的、无法区分的套接字,并将它们存储在 pair
中。此函数通常用于 IPC(进程间通信)。
domain
domain
参数指定套接字要使用的协议族。有关完整列表,请参阅 socket_create()。
type
type
参数选择套接字要使用的通信类型。有关完整列表,请参阅 socket_create()。
protocol
protocol
参数设置在指定 domain
内的特定协议,该协议在返回的套接字上进行通信时使用。可以使用 getprotobyname() 通过名称检索适当的值。如果所需的协议是 TCP 或 UDP,则还可以使用相应的常量 SOL_TCP
和 SOL_UDP
。
有关支持的协议的完整列表,请参阅 socket_create()。
pair
对将插入其中两个 Socket 实例的数组的引用。
范例 #1 socket_create_pair() 示例
<?php
$sockets = array();
/* 在 Windows 上,我们需要使用 AF_INET */
$domain = (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN' ? AF_INET : AF_UNIX);
/* 设置套接字对 */
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);
/* 关闭套接字 */
socket_close($sockets[0]);
socket_close($sockets[1]);
?>
范例 #2 socket_create_pair() IPC 示例
<?php
$ary = array();
$strone = '来自父进程的消息。';
$strtwo = '来自子进程的消息。';
if (socket_create_pair(AF_UNIX, SOCK_STREAM, 0, $ary) === false) {
echo "socket_create_pair() 失败。原因: ".socket_strerror(socket_last_error());
}
$pid = pcntl_fork();
if ($pid == -1) {
echo '无法创建进程。';
} elseif ($pid) {
/*父进程*/
socket_close($ary[0]);
if (socket_write($ary[1], $strone, strlen($strone)) === false) {
echo "socket_write() 失败。原因: ".socket_strerror(socket_last_error($ary[1]));
}
if (socket_read($ary[1], strlen($strtwo), PHP_BINARY_READ) == $strtwo) {
echo "收到 "$strtwo\n";
}
socket_close($ary[1]);
} else {
/*子进程*/
socket_close($ary[1]);
if (socket_write($ary[0], $strtwo, strlen($strtwo)) === false) {
echo "socket_write() 失败。原因: ".socket_strerror(socket_last_error($ary[0]));
}
if (socket_read($ary[0], strlen($strone), PHP_BINARY_READ) == $strone) {
echo "收到 "$strone\n";
}
socket_close($ary[0]);
}
?>
提供的代码示例之一存在语法错误,应该如下所示:
<?php
$sockets = array();
/* 设置套接字对 */
if (socket_create_pair(AF_UNIX, 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);
/* 关闭套接字 */
socket_close($sockets[0]);
socket_close($sockets[1]);
?>