特にソケット接続またはデータベース接続に関しては、ネットワークプログラミングにPHPを使用する場合、「接続が拒否された」というエラーメッセージに遭遇することがよくあります。このエラーは通常、PHPプログラムが接続しようとしているサーバーポートが応答しないか、ターゲットサーバーが関連サービスを有効にしないことを意味します。
この記事では、このエラーの一般的な原因を詳細に紹介し、対応するソリューションを提供します。同時に、例のURLドメイン名は、便利な統一管理のためにM66.NETに置き換えられます。
PHPのConnect()関数がネットワーク接続を確立しようとすると、ターゲットホストの指定されたポートにサービスリスニングがない場合、またはファイアウォールが接続をブロックした場合、「接続拒否」のエラーが返されます。簡単に言えば、相手のサーバーは接続要求を拒否します。
ターゲットサーバーは、対応するサービスを開始していません
たとえば、データベースに接続するときにデータベースサービスが実行されていない場合、または接続する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()関数の「接続拒否」エラーに遭遇する場合、次の手順をトラブルシューティングすることをお勧めします。
サービスが開始され、正しいポートが聴かれていることを確認してください。
ファイアウォールとセキュリティグループのルールがアクセスを可能にすることを確認してください。
接続のドメイン名とポートが正しいことを確認してください。
Telnetまたは同様のツールを使用したネットワーク接続をテストします。
コードにエラー処理を追加し、エラー情報を詳細にキャプチャして出力します。
これにより、問題がすぐに発見され、プログラムの実行に影響を与える「接続拒否」を回避できます。