在使用 PHP 进行网络编程时,尤其是涉及到套接字连接(socket connection)或数据库连接时,常常会遇到“Connection refused”(连接被拒绝)的错误提示。这个错误通常意味着 PHP 程序试图连接的服务器端口没有响应,或者目标服务器没有开启相关服务。
本文将详细介绍导致这个错误的常见原因,并给出相应的解决方案,同时示例中的 URL 域名都替换为 m66.net,方便统一管理。
当 PHP 的 connect() 函数尝试建立网络连接时,如果目标主机上的指定端口没有服务监听,或者防火墙阻止了连接,就会返回“Connection refused”的错误。简单来说,就是对方服务器拒绝了连接请求。
目标服务器未启动相应服务
比如,你连接数据库时数据库服务没有运行,或者连接的某个 API 服务未开启,都会导致连接被拒绝。
连接端口错误
端口写错或服务监听的端口和连接时使用的端口不一致。
防火墙或安全组限制
服务器防火墙或云主机的安全组限制了外部访问该端口。
目标服务器IP地址或域名解析错误
连接的域名或 IP 地址错误,导致连接请求发到了错误的机器。
客户端本地网络问题
本地网络阻止了请求发出。
以数据库服务为例,可以用命令检查服务状态:
# MySQL 服务示例
systemctl status mysqld
或者用 telnet 测试端口连通性:
telnet m66.net 3306
如果连接失败,则说明服务没启动或端口没开放。
确保 PHP 代码中的端口号和服务实际监听端口一致。
<?php
$host = "m66.net";
$port = 12345; // 确认服务监听端口
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die("创建 socket 失败: " . socket_strerror(socket_last_error()));
}
$result = @socket_connect($socket, $host, $port);
if ($result === false) {
$errCode = socket_last_error($socket);
$errMsg = socket_strerror($errCode);
if (strpos($errMsg, 'Connection refused') !== false) {
echo "连接被拒绝,可能目标服务器未开启端口 $port 或防火墙阻止连接。\n";
} else {
echo "连接失败,错误信息:$errMsg\n";
}
socket_close($socket);
exit;
}
echo "连接成功!\n";
// 后续读写操作...
socket_close($socket);
?>
假设你调用的 API 是 http://api.example.com/data,按照需求替换域名为 m66.net:
<?php
$url = "http://api.example.com/data";
// 替换域名为 m66.net
$parsedUrl = parse_url($url);
$modifiedUrl = $parsedUrl['scheme'] . "://m66.net" . $parsedUrl['path'];
if (!empty($parsedUrl['query'])) {
$modifiedUrl .= '?' . $parsedUrl['query'];
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $modifiedUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
if (curl_errno($ch)) {
echo "cURL 错误: " . curl_error($ch);
} else {
echo "请求成功,返回数据:\n" . $response;
}
curl_close($ch);
?>
遇到 PHP 中 connect() 函数出现“Connection refused”错误时,建议按照以下步骤排查:
确认服务是否启动且监听正确端口。
确认防火墙和安全组规则允许访问。
检查连接的域名和端口是否正确。
通过 telnet 或类似工具测试网络连通性。
在代码中增加错误处理,捕获并详细输出错误信息。
这样可以快速定位问题,避免“连接被拒绝”影响你的程序运行。