web-dev-qa-db-ja.com

インターネットに接続されているかどうかをPHPスクリプトで判断しますか?

開発マシンで実行されているPHPスクリプトからインターネットに接続しているかどうかを確認するにはどうすればよいですか?

スクリプトを実行して、wgetを使用して一連のファイル(存在する場合と存在しない場合があります)をダウンロードします。接続せずにダウンロードしようとすると、wgetはファイルが存在しないと考えて次のファイルに進みます。

44
Steve
<?php
function is_connected()
{
    $connected = @fsockopen("www.example.com", 80); 
                                        //website, port  (try 80 or 443)
    if ($connected){
        $is_conn = true; //action when connected
        fclose($connected);
    }else{
        $is_conn = false; //action in connection failure
    }
    return $is_conn;

}
?>
79

あなたはいつでも良い 'ol trusty googleをpingできます:

$response = null;
system("ping -c 1 google.com", $response);
if($response == 0)
{
    // this means you are connected
}
8
Gabi Purcaru

このコードはlaravel 4.2内部サーバー500エラーを伴うphpフレームワークで失敗しました:

<?php
     function is_connected()
     {
       $connected = @fsockopen("www.some_domain.com", 80); 
        //website, port  (try 80 or 443)
       if ($connected){
          $is_conn = true; //action when connected
          fclose($connected);
       }else{
         $is_conn = false; //action in connection failure
       }
      return $is_conn;
    }
?>

それを理解するために自分にストレスをかけたくなかったので、このコードを試しましたが、うまくいきました:

function is_connected()
{
  $connected = fopen("http://www.google.com:80/","r");
  if($connected)
  {
     return true;
  } else {
   return false;
  }

} 

以下に注意してください。これは、google.comへの接続が失敗しにくいという前提に基づいています。

8
user28864

ダウンロードが成功したかどうかを判断するために、wgetから戻りコードをフェッチしてみませんか?可能な値のリストは wget exit status にあります。

一方、PHPの curl functions を使用することもできます。これにより、PHP内からすべてのエラー追跡を行うことができます。

3
wimvds

受け入れられた答えは私にはうまくいきませんでした。インターネットが切断されると、PHPエラーがスローされました。そのため、以下の小さな変更を加えて使用しました。

if(!$sock = @fsockopen('www.google.com', 80))
{
    echo 'Not Connected';
}
else
{
echo 'Connected';
}
2
hilbiazhar

インターネット接続を決定するさまざまな要因があります。たとえば、インターフェースの状態。ただし、それらの点に関しては、ネットの性質上、適切な構成では接続が機能しているとは言えません。

したがって、最善の方法は、確実に存在するファイルをダウンロードすることです。成功したら、次の手順に従うことができます。そうでない場合は、一度再試行してから失敗します。

宛先ホストで1つを選択してください。不可能な場合は、googleやyahooなどの主要なウェブサイトを選択してください。

最後に、wgetから返されたエラーコードを確認してください。それらは404-sとタイムアウトでは異なるに違いない。 exec呼び出しで3番目のパラメーターを使用できます。

string exec(string $ command [、array&$ output [、int&$ return_var]])

1
/*
 * Usage: is_connected('www.google.com')
 */
function is_connected($addr)
  {
    if (!$socket = @fsockopen($addr, 80, $num, $error, 5)) {
      echo "OFF";
    } else {
      echo "ON";
    }
  }
1
cagcak

人気のあるサイトまたはアクセス元のサイト(www.google.nlなど)にpingを実行し、結果を解析して接続できるかどうかを確認できます。

<?php
$ip = '127.0.0.1'; //some ip
exec("ping -n 4 $ip 2>&1", $output, $retval);
if ($retval != 0) { 
echo "no!"; 
} 
else 
{ 
echo "yes!"; }
?>
0
Roy T.

wgetの結果を確認してください。ステータスコード4はネットワークの問題を示し、ステータスコード8はサーバーエラー(404など)を示します。これは、すべてのファイルに対して1回ではなく、各ファイルに対してwgetを呼び出す場合にのみ機能します。

Wgetを呼び出す代わりに、PHPでlibcurlを使用することもできます。何かのようなもの:

foreach (...) {
    $c = curl_init($url);
    $f = fopen($filepath, "w")
    curl_setopt($c, CURLOPT_FILE, $f);
    curl_setopt($c, CURLOPT_HEADER, 0);
    if (curl_exec($c)) {
        if (curl_getinfo($c, CURLINFO_HTTP_CODE) == 200) {
            // success
        } else {
            // 404 or something, delete file
            unlink($filepath);
        }
    } else {
        // network error or server down
        break; // abort
    }
    curl_close($c);
}
0
Dietrich Epp

この関数は必要なものを処理します

function isConnected()
{
    // use 80 for http or 443 for https protocol
    $connected = @fsockopen("www.example.com", 80);
    if ($connected){
        fclose($connected);
        return true; 
    }
    return false;
}
0
Lost Koder