PHP pfsockopen 函数
最后修改于 2025 年 4 月 4 日
PHP pfsockopen
函数用于打开一个持久的 Internet 或 Unix 域套接字连接。它类似于 fsockopen,但会在请求之间维护连接。
基本定义
pfsockopen
建立到指定主机和端口的持久套接字连接。该连接在多个脚本执行过程中保持打开状态。
语法:pfsockopen(string $hostname, int $port = -1, int &$errno = null, string &$errstr = null, float $timeout = ini_get("default_socket_timeout"))
。成功时返回文件指针,失败时返回 false。
基本 HTTP 请求
此示例演示了如何使用 pfsockopen 进行简单的 HTTP GET 请求。
<?php declare(strict_types=1); $fp = pfsockopen("www.example.com", 80, $errno, $errstr, 30); if (!$fp) { echo "Error: $errstr ($errno)"; } else { $out = "GET / HTTP/1.1\r\n"; $out .= "Host: www.example.com\r\n"; $out .= "Connection: Close\r\n\r\n"; fwrite($fp, $out); while (!feof($fp)) { echo fgets($fp, 128); } fclose($fp); }
这会连接到端口 80 上的 example.com 并发送一个基本的 HTTP GET 请求。响应被逐行读取并输出。连接是持久的。
SMTP 邮件发送
此示例展示了如何使用 pfsockopen 通过 SMTP 发送电子邮件。
<?php declare(strict_types=1); $smtp = pfsockopen("mail.example.com", 25, $errno, $errstr, 30); if (!$smtp) { die("Error: $errstr ($errno)"); } function smtp_command($socket, $cmd) { fwrite($socket, $cmd . "\r\n"); return fgets($socket, 512); } echo smtp_command($smtp, "EHLO localhost"); echo smtp_command($smtp, "MAIL FROM: <sender@example.com>"); echo smtp_command($smtp, "RCPT TO: <recipient@example.com>"); echo smtp_command($smtp, "DATA"); echo smtp_command($smtp, "Subject: Test\r\n\r\nHello World\r\n."); echo smtp_command($smtp, "QUIT"); fclose($smtp);
这会连接到 SMTP 服务器并发送一封基本邮件。连接在命令之间保持不变。每个 SMTP 命令都会收到服务器的响应。
自定义 TCP 服务器通信
此示例演示了与自定义 TCP 服务器的通信。
<?php declare(strict_types=1); $socket = pfsockopen("tcp://127.0.0.1", 9000, $errno, $errstr, 30); if (!$socket) { die("Error: $errstr ($errno)"); } fwrite($socket, "PING\r\n"); $response = fgets($socket, 1024); echo "Server response: $response"; fwrite($socket, "QUIT\r\n"); fclose($socket);
这会连接到端口 9000 上的本地 TCP 服务器。它发送一个 PING 命令并读取响应。连接会保持打开状态以供后续请求。
带上下文的 HTTPS 连接
此示例展示了如何建立安全的 HTTPS 连接。
<?php declare(strict_types=1); $context = stream_context_create([ 'ssl' => [ 'verify_peer' => false, 'verify_peer_name' => false ] ]); $fp = pfsockopen('ssl://www.example.com', 443, $errno, $errstr, 30, $context); if (!$fp) { die("Error: $errstr ($errno)"); } $out = "GET / HTTP/1.1\r\n"; $out .= "Host: www.example.com\r\n"; $out .= "Connection: Close\r\n\r\n"; fwrite($fp, $out); while (!feof($fp)) { echo fgets($fp, 128); } fclose($fp);
这会使用 SSL 建立安全的 HTTPS 连接。流上下文允许配置 SSL 参数。连接会保持不变以便重复使用。
Unix 域套接字通信
此示例演示了与 Unix 域套接字的通信。
<?php declare(strict_types=1); $socket = pfsockopen("unix:///var/run/myservice.sock", 0, $errno, $errstr, 30); if (!$socket) { die("Error: $errstr ($errno)"); } fwrite($socket, "STATUS\r\n"); $response = fgets($socket, 1024); echo "Service status: $response"; fclose($socket);
这会连接到位于 /var/run/myservice.sock 的 Unix 域套接字。它发送一个 STATUS 命令并读取响应。连接保持持久。
最佳实践
- 错误处理:始终检查连接错误
- 超时:设置适当的超时值
- 清理:完成后关闭连接
- 安全:验证所有输入/输出
- 性能:尽可能重用连接
来源
本教程通过针对各种使用持久连接的网络通信场景的实际示例,涵盖了 PHP pfsockopen
函数。
作者
列出 所有 PHP 网络函数。