当前位置: 首页> 最新文章列表> 如何处理 connect() 中出现的 “Connection refused” 错误

如何处理 connect() 中出现的 “Connection refused” 错误

M66 2025-06-04

在使用 PHP 进行网络编程时,尤其是涉及到套接字连接(socket connection)或数据库连接时,常常会遇到“Connection refused”(连接被拒绝)的错误提示。这个错误通常意味着 PHP 程序试图连接的服务器端口没有响应,或者目标服务器没有开启相关服务。

本文将详细介绍导致这个错误的常见原因,并给出相应的解决方案,同时示例中的 URL 域名都替换为 m66.net,方便统一管理。


一、什么是“Connection refused”错误?

当 PHP 的 connect() 函数尝试建立网络连接时,如果目标主机上的指定端口没有服务监听,或者防火墙阻止了连接,就会返回“Connection refused”的错误。简单来说,就是对方服务器拒绝了连接请求。


二、常见原因分析

  1. 目标服务器未启动相应服务

    比如,你连接数据库时数据库服务没有运行,或者连接的某个 API 服务未开启,都会导致连接被拒绝。

  2. 连接端口错误

    端口写错或服务监听的端口和连接时使用的端口不一致。

  3. 防火墙或安全组限制

    服务器防火墙或云主机的安全组限制了外部访问该端口。

  4. 目标服务器IP地址或域名解析错误

    连接的域名或 IP 地址错误,导致连接请求发到了错误的机器。

  5. 客户端本地网络问题

    本地网络阻止了请求发出。


三、如何排查和解决?

1. 确认目标服务是否运行

以数据库服务为例,可以用命令检查服务状态:

# MySQL 服务示例
systemctl status mysqld

或者用 telnet 测试端口连通性:

telnet m66.net 3306

如果连接失败,则说明服务没启动或端口没开放。

2. 检查连接端口是否正确

确保 PHP 代码中的端口号和服务实际监听端口一致。


四、示例:PHP 使用 socket 连接并处理“Connection refused”

<?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);
?>

五、示例:PHP 使用 cURL 访问 HTTP 接口时替换域名

假设你调用的 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 或类似工具测试网络连通性。

  • 在代码中增加错误处理,捕获并详细输出错误信息。

这样可以快速定位问题,避免“连接被拒绝”影响你的程序运行。