當前位置: 首頁> 最新文章列表> 如何解決PHP 中connect() 函數出現的“Connection refused” 錯誤?

如何解決PHP 中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 或類似工具測試網絡連通性。

  • 在代碼中增加錯誤處理,捕獲並詳細輸出錯誤信息。

這樣可以快速定位問題,避免“連接被拒絕”影響你的程序運行。