在使用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 或類似工具測試網絡連通性。
在代碼中增加錯誤處理,捕獲並詳細輸出錯誤信息。
這樣可以快速定位問題,避免“連接被拒絕”影響你的程序運行。