PHP fsockopen 函数
最后修改于 2025 年 4 月 4 日
PHP fsockopen 函数打开一个网络套接字连接。它支持使用各种协议进行低级网络通信。
基本定义
fsockopen 启动与指定主机的套接字连接。它适用于 IPv4 和 IPv6 地址的 TCP/IP 套接字。
语法:fsockopen(string $hostname, int $port, int &$errno, string &$errstr, float $timeout = ini_get("default_socket_timeout")): resource|false。成功时返回文件指针,失败时返回 false。
基本 HTTP 请求
此示例演示如何使用 fsockopen 发出简单的 HTTP GET 请求。
<?php
declare(strict_types=1);
$fp = fsockopen("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);
}
这会连接到 example.com 的 80 端口(HTTP),发送一个 GET 请求,并读取响应。连接在之后被正确关闭。
SMTP 邮件发送
这展示了如何使用原始套接字通信通过 SMTP 发送电子邮件。
<?php
declare(strict_types=1);
$smtp = fsockopen("smtp.example.com", 25, $errno, $errstr, 30);
if (!$smtp) {
die("Error: $errstr ($errno)");
}
$commands = [
"EHLO localhost\r\n",
"MAIL FROM: <sender@example.com>\r\n",
"RCPT TO: <recipient@example.com>\r\n",
"DATA\r\n",
"Subject: Test\r\n\r\nHello World\r\n.\r\n",
"QUIT\r\n"
];
foreach ($commands as $cmd) {
fwrite($smtp, $cmd);
echo fgets($smtp, 256);
}
fclose($smtp);
这连接到 SMTP 服务器,并通过直接发出 SMTP 命令来发送基本电子邮件。每个命令都会收到来自服务器的响应。
端口扫描器
此示例创建一个简单的端口扫描器来检查主机上的开放端口。
<?php
declare(strict_types=1);
function scanPort($host, $port, $timeout = 1) {
$fp = @fsockopen($host, $port, $errno, $errstr, $timeout);
if ($fp) {
fclose($fp);
return true;
}
return false;
}
$host = "example.com";
$ports = [21, 22, 25, 80, 443];
foreach ($ports as $port) {
$status = scanPort($host, $port) ? "open" : "closed";
echo "Port $port is $status\n";
}
该函数尝试使用短超时时间连接到每个端口。如果连接成功,则端口已打开。这是一个基本的安全工具。
自定义 TCP 客户端
这演示了一个自定义 TCP 客户端,用于发送和接收数据。
<?php
declare(strict_types=1);
$socket = fsockopen("tcp://127.0.0.1", 9000, $errno, $errstr, 30);
if (!$socket) {
die("Error: $errstr ($errno)");
}
fwrite($socket, "Hello Server!\n");
echo "Server says: " . fgets($socket, 1024);
fclose($socket);
这连接到本地 TCP 服务器的 9000 端口,发送一条消息,并读取响应。适用于自定义协议的实现。
HTTPS 连接
这展示了如何使用 fsockopen 建立安全的 HTTPS 连接。
<?php
declare(strict_types=1);
$host = "www.example.com";
$port = 443;
$timeout = 30;
$fp = fsockopen("ssl://$host", $port, $errno, $errstr, $timeout);
if (!$fp) {
die("Error: $errstr ($errno)");
}
$out = "GET / HTTP/1.1\r\n";
$out .= "Host: $host\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
while (!feof($fp)) {
echo fgets($fp, 128);
}
fclose($fp);
这使用 ssl:// 协议前缀连接到 443 端口 (HTTPS)。其余部分的工作方式类似于 HTTP,但使用加密的传输层安全性。
最佳实践
- 错误处理: 始终检查连接错误
- 超时: 设置适当的超时值
- 资源清理: 始终使用 fclose 关闭连接
- 安全: 验证所有输入以防止注入
- 性能: 尽可能重用连接
来源
本教程涵盖了 PHP fsockopen 函数,并提供了各种网络通信场景的实用示例。
作者
列出 所有 PHP 网络函数。