2016-05-27 12 views
2

私のサーバーの状態を確認するための簡単なPHPスクリプトが用意されています。これはexec()を介して実行される標準のpingコマンドを使用します。PHP - Linux上でpingを実行するとスクリプトがハングアップする

  • Windowsの場合、サーバーはオンラインの場合でもスクリプトが正常に機能し、ダウンの場合は です。
  • Linuxの場合、スクリプトはサーバがオンラインのときに機能しますが、サーバがダウンしている場合は、 のときにハングします。タイムアウトは後者には影響しないようです。

コンソールから同じコマンドを使用してpingを実行すると、正常に動作して正しくタイムアウトします。


原因とはどのように解決されましたか?

if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { 
    $exec_string = 'ping -n 1 -i 255 -w 2 ' . $host; 
} else { 
    $exec_string = 'ping -n -c 1 -t 255 -w 2 ' . $host; 
} 
exec($exec_string, $output, $return); 

答えて

1

私がなぜわからないんだけど、FastCGIのにsuPHPからの切り替え(suEXECのとの両方が有効になって)問題とpingを解決するように見えた:私はあなたにもセットアップポートとタイムアウトができ、found here、このスクリプトを使用します期待通りのアウト。

誰かがこれについて説明していれば、私はコメントや回答の形式で知りたいと思います。

2

exec()を使用して直接pingを行うことは避けます。適切回

function ping($host, $port = 80, $timeout = 6) { 
    $fsock = fsockopen($host, $port, $errno, $errstr, $timeout); 
    if (!$fsock) { 
     return false; 
    } else { 
     return true; 
    } 
} 

$host = 'www.example.com'; 

if(ping($host)) { 
    echo "HOST UP"; 
} else { 
    echo "HOST DOWN"; 
} 
+0

私はこれが適切な解決策であることに同意します。これは、特にシステム関数呼び出しが利用できない場合に機能するためです。しかし、あなたはexecを使ってpingをしないように説明していませんでしたか? – ar34z

+0

fsockopenは既にバックアップソリューションとして使用されているため、質問には含まれていませんでした。 – techjwalker

+0

セキュリティ上の理由から 'exec()'が無効になることが多いので、 'exec()'は避けがちです。 – Napolux

関連する問題