私はインターネット接続にいくつかの問題を抱えていましたが、ホストコンピュータがインターネットに接続されているかどうかを確認するための、最も速く、エラーがなく、最も信頼できる方法は何でしょうか。
is_online()
オンラインの場合はtrueを返し、そうでない場合はfalseを返すようなものを探しています。
私はインターネット接続にいくつかの問題を抱えていましたが、ホストコンピュータがインターネットに接続されているかどうかを確認するための、最も速く、エラーがなく、最も信頼できる方法は何でしょうか。
is_online()
オンラインの場合はtrueを返し、そうでない場合はfalseを返すようなものを探しています。
私はいくつかの解決策をベンチマークしました: file_get_contents with HEAD request, gethostbynamel , checkdnsrrそして、次の解決策は他のすべてよりも100以上速いようです:
function is_online()
{
return (checkdnsrr('google.com', 'ANY') && checkdnsrr('yahoo.com', 'ANY') && checkdnsrr('microsoft.com', 'ANY'));
}
各ホストごとに約 1 マイクロ秒file_get_contents
かかりますが、たとえば、各ホストごとに 1 秒以上かかります (オフラインの場合)。
おそらく稼働しているホスト (Google など) に ping を送信できます。
これにはPHPが組み込まれていないようですので、シェルコマンドに頼る必要があります. on *nixの戻り値はping
、応答が受信されたかどうかを示します。
更新: ping -c1 -q -w1
Linux では適切なコマンドである必要があります。これにより、応答が受信された場合は終了コード 0 が返され、それ以外の場合は終了コードが返され、1 秒後にタイムアウトになります。
したがって、次のようなもの(警告、私のPHPは錆びています)がうまくいくはずです:
function is_online() {
$retval = 0;
system("ping -c1 -q -w1", $retval);
return $retval == 0;
}
人気のある Web サイトで多くのHTTP GET
(または速度を上げるためにはなおさら) リクエストを実行してみませんか? 多数決で答えを決めますHTTP HEAD
。
(PHP のシステム コールを介して)依存することもできますがping
、すべての Web サイトが ICMP (ping) 要求に応答するわけではないことに注意してください。
結論を出す前に行う ping/http リクエストの数を増やすことで、回答の信頼度を向上させることができますが、最悪の場合、エラーをなくすことはできないことに注意してください。
これは、サーバーが ICMP リクエストに応答することを前提としていることを忘れないでください。その場合は、おそらく Net_Ping を使用することをお勧めします。同じく PEAR で Net_Socket パッケージを使用して、実行しているサービスに応じて、おそらくポート 7 またはポート 80 から応答を取得することがわかっているポートへの接続を試みることができなかった場合。