数百のアドレスに ping を実行し、その値 (ミリ秒) を返す関数を作成しようとしています。これまでのところ、pingを実行して結果を取得するという最初のアイデアを達成しましたが、何百ものアドレスに同じコードを使用すると問題が発生し、タイムアウトするか最後のpingコマンドに到達するまでPHPページが停止します。
結果を段階的に出力するための提案が得られれば幸いです。現在のコードは次のとおりです。
<?php
// "for" loop added according to suggestion for browser compatibility (IE, FF, CHR, OPR, SFR)
for($i = 0; $i < 5000; $i++)
{
echo ' ';
}
function GetPing($ip = NULL) {
// Returns the client ping if no address has been passed to the function
if(empty($ip)) {
$ip = $_SERVER['REMOTE_ADDR'];
}
// Check which OS is being run by the client
if(getenv('OS') == 'Windows_NT') {
//echo '<b>Detected local system:</b> Windows NT/2000/XP/2003/2008/Vista/7<p>';
$exec = exec("ping -n 1 -l 32 -i 128 " . $ip);
return end(explode(' ', $exec));
}
else {
//echo '<b>Detected local system:</b> Linux/Unix<p>';
$exec = exec("ping -c 1 -s 32 -t 128 " . $ip);
$array = explode('/', end(explode('=', $exec )));
return ceil($array[1]) . 'ms';
}
// ob_flush and flush added according to suggestion for buffer output
ob_flush();
flush();
}
// Added to test 20 sequential outputs
for($count = 0; $count < 20; $count++)
echo GetPing('8.8.8.8') . '<div>';
?>
いくつかのフィードバックの後、スクリプトにforループと ob_flush() および flush() を追加し、 php.iniで output_buffering を 0 に設定しました。これまでにテストしたほとんどのブラウザー (IE8、Firefox 12、Chrome 19、Opera 11、Safari 5) で動作するようです。現在のコードは意図したとおりに機能しているようですが、それを改善するための提案は非常に高く評価されています。
ご意見ありがとうございます。