毎日の開発では、Webサービス(80、443など)、データベースサービス(3306、5432など)、またはカスタムポートが正常に実行されているかどうかなど、リモートサーバーの特定のポートが開いているかどうかを確認する必要がある場合があります。 FSOCCKOPEN()は、ソケット接続の確立に使用できるPHPによって提供されるネイティブ関数であり、単純なポートプロービングにも使用できます。
この記事では、FSOCCKOPEN()関数を使用して、リモートサーバーポートが開いているかどうかを検出し、特定の実装ステップと予防策を提供する方法を紹介します。
FSOCCKOPEN()は、ネットワーク接続またはUNIXソケット接続を開くために使用される関数です。構文は次のとおりです。
resource|false fsockopen(
string $hostname,
int $port,
int &$error_code = null,
string &$error_message = null,
float $timeout = ini_get("default_socket_timeout")
)
パラメーター説明:
$ hostname :ターゲットホスト。ドメイン名またはIPアドレスにすることができます。
$ポート:接続するポート番号。
$ error_code (オプション):接続が失敗したときのエラーコード。
$ error_message (オプション):接続が失敗したときのエラーメッセージ。
$タイムアウト(オプション):接続タイムアウト(秒)。
fsocckopen()を介して指定されたアドレスのポートに接続しようとします。接続が成功した場合、ポートが開いていると考えることができます。それ以外の場合、ポートは閉じていると見なされるか、ホストが到達できないと見なされます。
<?php
function isPortOpen($host, $port, $timeout = 5)
{
$errno = 0;
$errstr = '';
$connection = @fsockopen($host, $port, $errno, $errstr, $timeout);
if (is_resource($connection)) {
fclose($connection);
return true;
} else {
return false;
}
}
// 例:テスト gitbox.net の 443 ポートは開いていますか?
$host = 'gitbox.net';
$port = 443;
if (isPortOpen($host, $port)) {
echo "ポート {$port} 存在する {$host} 上是开放の。";
} else {
echo "ポート {$port} 存在する {$host} オープンまたは到達不可能ではありません。";
}
ターゲットホストとポート番号を定義します<br> gitbox.netや443など、検出するサーバーアドレスとポートを決定します。
fsocckopen() <br>を使用して接続しようとしています @FSOCOPEN()を使用して、デフォルトのエラー出力を抑制し、接続が戻り値によって成功しているかどうかを判断します。
接続の結果を処理します
成功:ポートが開いていることを意味します。
失敗:ポートが開いていないことを示します。これは、サーバーファイアウォールが原因であるか、ポートが聴いていない可能性があります。
接続リソースを閉じます<BR> 接続が成功した場合は、 fclose()を使用して接続リソースを閉じて、リソースの漏れを避ける必要があります。
Webサイトの監視システムでは、サービスポートが正常かどうかを定期的に確認します。
自動展開ツールで、ターゲットサービスの準備ができていることを確認します。
ローカル開発とデバッグ中に港湾アクセシビリティをすばやく検出します。
操作およびメンテナンスツールスクリプトにポート検出機能を統合します。
FSOCOPEN()は、高い並行性ポート検出シナリオには適しておらず、その効率は比較的低いです。
一部のサーバー構成では、セキュリティポリシーによりこの機能が禁止される場合があります。
@を使用してエラー出力を抑制する場合、例外をうまく処理してください。
検出されたサーバーは、IPホワイトリスト、ファイアウォールなどで構成されている場合があり、検出結果に影響します。