Я попытался несколько попыток заставить мой флеш и ob_flush работать. Я попытался установить ini для буферизации, я попытался использовать несколько различных функций, которые я нашел в Интернете для буферизации вывода, и ни один из них вообще не работает. Сценарий хочет подождать, пока он не будет выполнен полностью, пока он не выйдет из эха. Вот сценарий, который у меня есть
ob_start(); //Login User echo 'Logging in to user<br>'; ob_flush(); flush(); $ch = curl_init("http://www.mysite.com/login/"); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, "username=$user&pass=$pass"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_COOKIEJAR, "cookies/$cookie"); curl_setopt($ch, CURLOPT_COOKIEFILE, "cookies/$cookie"); $output = curl_exec($ch); curl_close($ch); ob_flush(); flush(); //Update Status echo 'Updating Status<br>'; ob_flush(); flush(); $ch = curl_init("http://www.mysite.com/update/"); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, "status=$status"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_COOKIEJAR, "cookies/$cookie"); curl_setopt($ch, CURLOPT_COOKIEFILE, "cookies/$cookie"); $output = curl_exec($ch); curl_close($ch); ob_flush(); flush();
Я хочу, чтобы он отражал то, что он делает, затем запускал функцию, затем повторял что-то еще, а затем выполнял другую функцию. Я хочу, чтобы все буферы были сброшены и отображены в реальном времени в браузере.
Идея здесь состоит в том, чтобы отключить буферизацию вывода, а не включать ее. Как видно из названия, буферизация вывода будет сохранять вывод в память и отображать его в конце скрипта или когда его явно запрашивают.
При этом вам не нужно явно скрывать каждый вывод. Перед отображением любого выходного сигнала используйте следующее, и вам не придется беспокоиться о том, чтобы промывать каждый раз, когда вы что-то повторяете:
ob_implicit_flush(true); ob_end_flush();
Например:
ob_implicit_flush(true); ob_end_flush(); for ($i=0; $i<5; $i++) { echo $i.'<br>'; sleep(1); }
Будет выводиться от 0 до 4, каждый из которых будет отображаться каждую секунду.
Этот вопрос, похоже, всплывает в поиске Google, поэтому я хотел его обновить. Это сентябрь 2014 года …..
Ответ @Netcoder действительно работает, но Chrome иногда все равно выводит все сразу.
Чтобы исправить это, просто добавили ob_flush()
and flush()
в код, он будет выводиться после каждой секунды.
Пример:
ob_implicit_flush(true); ob_end_flush(); for ($i=0; $i<5; $i++) { echo $i.'<br>'; ob_flush(); flush(); sleep(1); }
Я просто хотел бы написать краткую заметку о том, что я наблюдал, в 2016 году, о различных подходах, предложенных:
Вышеприведенные коды, предлагаемые netcoder и David, работают для меня в следующих браузерах:
Он не работает в Firefox, Safari или IE 10-11.
Я также проверил альтернативный код:
<?php if (ob_get_level() == 0) ob_start(); for ($i = 0; $i<10; $i++){ echo "<br> Line to show."; echo str_pad('',4096)."\n"; ob_flush(); flush(); sleep(2); } echo "Done."; ob_end_flush(); ?>
Который можно найти здесь: http://php.net/manual/en/function.flush.php#54841
Который, кажется, имеет лучшую текущую поддержку через все браузеры:
Кажется, что рабочие реализации меняются год за годом, поэтому я хотел предложить обновление того, что я нашел для себя в данный момент.
У меня была та же проблема, но пользователь указал мне в правильном направлении, я использовал цикл «для», чтобы решить эту проблему, связанную с браузером:
for($i = 0; $i < 5000; $i++) { echo ' '; }
Относительно вывода результатов exec () ping для получения более подробной информации.
это работает сейчас (по крайней мере, на php 5.5)
ob_end_flush(); while(stuff){ ..stuff... echo('yo'); flush(); }
вob_end_flush(); while(stuff){ ..stuff... echo('yo'); flush(); }
не нужно спать или что-то еще
<?php header('Content-Type: text/html; charset=utf-8'); // I think maybe you can set output_buffering using ini_set here, but I'm not sure. // It didn't work for me the first time at least, but now it does sometimes... // So I set output_buffering to Off in my php.ini, // which normally, on Linux, you can find at the following location: /etc/php5/apache2/php.ini @ini_set('output_buffering','Off'); @ini_set('zlib.output_compression',0); @ini_set('implicit_flush',1); @ob_end_clean(); set_time_limit(0); ob_start(); //echo str_repeat(' ',1024*8); //<-- For some reason it now even works without this, in Firefox at least? ?> <!DOCTYPE html> <html> <head> <title>PHP Flushing</title> </head> <body> <h1>Flushing the webpage in real-time using PHP.</h1> <?php ob_flush(); flush(); //Note: ob_flush comes first, then you call flush. I did this wrong in one of my own scripts previously. for($i=0; $i<5; $i++) { echo $i.'<br>'; ob_flush(); flush(); sleep(1); } ?> </body> </html>
Обратите внимание, что вам может потребоваться отключить сжатие gzip на вашем веб-сервере (apache или nginx).
Это была моя проблема.