開発マシンで実行されている PHP スクリプトからインターネットに接続しているかどうかを確認するにはどうすればよいですか?
スクリプトを実行して、wget を使用して一連のファイル (存在する場合と存在しない場合があります) をダウンロードします。接続せずにダウンロードしようとすると、wget はファイルが存在しないと考えて次のダウンロードに進みます。
開発マシンで実行されている PHP スクリプトからインターネットに接続しているかどうかを確認するにはどうすればよいですか?
スクリプトを実行して、wget を使用して一連のファイル (存在する場合と存在しない場合があります) をダウンロードします。接続せずにダウンロードしようとすると、wget はファイルが存在しないと考えて次のダウンロードに進みます。
<?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;
}
?>
信頼できる Google にいつでも ping を送信できます。
$response = null;
system("ping -c 1 google.com", $response);
if($response == 0)
{
// this means you are connected
}
このコードは、laravel 4.2 php フレームワークで内部サーバー 500 エラーで失敗していました。
<?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 への接続が失敗する可能性が低いという前提に基づいています。
受け入れられた答えは私にはうまくいきませんでした。インターネットが切断されると、php エラーがスローされました。そのため、以下のように少し変更して使用しました。
if(!$sock = @fsockopen('www.google.com', 80))
{
echo 'Not Connected';
}
else
{
echo 'Connected';
}
ダウンロードが成功したかどうかを判断するために、wget からリターン コードを取得してみませんか? 可能な値のリストはwget exit statusにあります。
一方、php のcurl 関数を使用することもできます。そうすれば、PHP 内からすべてのエラー追跡を行うことができます。
インターネット接続を決定するさまざまな要因があります。たとえば、インターフェイスの状態。ただし、それらに関係なく、ネットの性質上、適切な構成を行っても接続が機能しているとは限りません。
したがって、最善の方法は、存在することが確実なファイルをダウンロードすることです。成功した場合は、次の手順に進むことができます。そうでない場合は、一度再試行してから失敗します。
宛先ホストで 1 つを選択してみてください。それが不可能な場合は、Google や Yahoo などの主要な Web サイトを選択してください。
最後に、wget によって返されたエラー コードを確認してみてください。404-s とタイムアウトでは、それらは異なるに違いありません。exec
呼び出しで 3 番目のパラメーターを使用できます。
string exec ( string $command [, array &$output [, int &$return_var ]] )
の結果を確認するだけですwget
。ステータスコード4はネットワークの問題を示し、ステータスコード8はサーバーエラー(404など)を示します。これは、すべてのファイルに対して1回ではなく、各ファイルに対して順番にwgetを呼び出す場合にのみ機能します。
libcurl
wgetを呼び出す代わりに、PHPで使用することもできます。何かのようなもの:
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);
}
人気のあるサイトまたは取得元のサイト (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!"; }
?>