PHP Conference Japan 2024

stream_socket_client

(PHP 5, PHP 7, PHP 8)

stream_socket_client打开 Internet 或 Unix 域套接字连接

描述

stream_socket_client(
    字符串 $address,
    整数 &$error_code = null,
    字符串 &$error_message = null,
    ?浮点数 $timeout = null,
    整数 $flags = STREAM_CLIENT_CONNECT,
    ?资源 $context = null
): 资源|false

启动到由 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_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 现在可以为空。

范例

示例 #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() 检索可用传输的列表。有关内置传输的列表,请参阅 支持的套接字传输列表

参见

添加注释

用户贡献的注释 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