Вывод результата exec () ping постепенно

Я пытаюсь написать функцию, которая выводит несколько сотен адресов и возвращает их значения (миллисекунды). До сих пор я достиг первоначальной идеи, которая заключается в ping и получить результат, но проблема возникает при использовании одного и того же кода для сотен адресов, страница PHP останавливается, пока не истечет время или не дойдет до последней команды ping.

Я был бы рад, если бы мог получить некоторые предложения для вывода результатов постепенно, вот мой текущий код:

<?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 () в мой скрипт, и я также установил output_buffering в 0 в php.ini . Кажется, это работает для большинства браузеров, которые я тестировал до сих пор (IE8, Firefox 12, Chrome 19, Opera 11, Safari 5). Кажется, что текущий код теперь работает по назначению, но любое предложение улучшить его очень ценится.

Спасибо за ваш отзыв.

это просто догадка; Я написал много лет назад очень шаткий сценарий чата, который также использовал буферизацию вывода (и выбор новых сообщений в цикле while (true)).

Выполняя это, я столкнулся с теми же проблемами, что иногда скрипт застопорился (пустой экран), иногда потребовалось некоторое время, пока не появились символы, и, кроме того, это было специфично для браузера.

Вот соответствующие фрагменты кода, которые я добавил в скрипт, чтобы он работал с IE6 и FF2 (как я уже говорил, много лет назад …)

 <?php // End output buffering ob_end_flush(); // IE and Safari Workaround // They will only display the webpage if it's completely loaded or // at least 5000 bytes have been "printed". for($i=0;$i<5000;$i++) { echo ' '; } while( ... ) { echo 'Message'; ob_flush(); flush(); } ?> 

Это сработало для меня, так что, возможно, вы тоже могли бы попробовать. (Хотя я понятия не имею, как к этому будут относиться современные браузеры и серверная инфраструктура).

Я думаю, что то, что вы, возможно, ищете, постепенно работает и выводит скрипт, а не асинхронные функции.

См. Есть ли способ сделать PHP постепенно выводиться по мере выполнения скрипта?