对于那些希望使用 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 — 打开 Internet 或 Unix 域套接字连接
$address
,&$error_code
= null
,&$error_message
= null
,$timeout
= null
,$flags
= STREAM_CLIENT_CONNECT
,$context
= null
启动到由 address
指定的目标的流或数据报连接。创建的套接字类型由使用标准 URL 格式指定的传输确定:transport://target
。对于 Internet 域套接字 (AF_INET)(如 TCP 和 UDP),address
参数的 target
部分应由主机名或 IP 地址后跟冒号和端口号组成。对于 Unix 域套接字,target
部分应指向文件系统上的套接字文件。
注意:
默认情况下,流将以阻塞模式打开。您可以使用 stream_set_blocking() 将其切换到非阻塞模式。
address
要连接到的套接字的地址。
error_code
如果连接失败,将设置为系统级错误号。
error_message
如果连接失败,将设置为系统级错误消息。
timeout
在 connect()
系统调用超时之前的秒数。默认情况下,使用 default_socket_timeout。
注意: 此参数仅在未进行异步连接尝试时适用。
注意:
要为通过套接字读取/写入数据设置超时,请使用 stream_set_timeout(),因为
timeout
仅在建立套接字连接时适用。
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 现在可以为空。 |
示例 #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 "ERROR: $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() 遵循类似的方案,但它没有此特定功能。