PHP Flush / ob_flush не работает - PullRequest
       40

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

9 голосов
/ 19 декабря 2010

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

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

Ответы [ 7 ]

41 голосов
/ 19 декабря 2010

Идея в том, чтобы отключить буферизацию вывода, а не включить ее. Как следует из названия, буферизация вывода сохранит выходные данные в памяти и отобразит их в конце скрипта или при явном запросе.

При этом вам не нужно явно очищать каждый вывод. Используйте следующее, прежде чем отображать какие-либо выходные данные, и тогда вам не придется беспокоиться о сбросе каждый раз, когда вы что-то выводите:

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, каждый из которых отображается каждую секунду.

4 голосов
/ 25 января 2016

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

Вышеприведенные коды, предлагаемые netcoder и Дэвид работает для меня в следующих браузерах:

  • Chrome
  • Opera

Кажется, он не работает в 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

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

  • Chrome
  • Firefox
  • Opera
  • Safari
  • IE 10
  • IE 11

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

2 голосов
/ 05 сентября 2014

Похоже, этот вопрос часто появляется в поиске 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);
}   
1 голос
/ 25 сентября 2016

Обратите внимание, что вам может потребоваться отключить сжатие gzip на вашем веб-сервере (apache или nginx).

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

0 голосов
/ 06 сентября 2016
<?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>
0 голосов
/ 04 июля 2015

это работает сейчас (по крайней мере на PHP 5.5)

ob_end_flush();
while(stuff){
  ..stuff...
  echo('yo');
  flush();
}

не нужно спать или что-то еще

0 голосов
/ 30 мая 2012

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

for($i = 0; $i < 5000; $i++)
{
    echo ' ';
}

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

...