PHP Flush / ob_flush не работает

Я попытался несколько попыток заставить мой флеш и 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(); 

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

Related of "PHP Flush / ob_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

Который, кажется, имеет лучшую текущую поддержку через все браузеры:

  • Хром
  • Fire Fox
  • опера
  • Сафари
  • IE 10
  • IE 11

Кажется, что рабочие реализации меняются год за годом, поэтому я хотел предложить обновление того, что я нашел для себя в данный момент.

У меня была та же проблема, но пользователь указал мне в правильном направлении, я использовал цикл «для», чтобы решить эту проблему, связанную с браузером:

 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).

Это была моя проблема.