Есть ли способ заставить PHP печатать данные в веб-браузере в режиме реального времени? - PullRequest
9 голосов
/ 25 сентября 2008

Например, если у меня есть оператор echo, нет гарантии, что браузер может отобразить его сразу, может отобразить несколько десятков операторов echo одновременно и может подождать, пока вся страница не будет готова, прежде чем что-либо отображать.

Есть ли способ, чтобы каждое эхо отображалось в браузере во время его выполнения?

Ответы [ 8 ]

10 голосов
/ 25 сентября 2008

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

Вы можете включить неявную очистку с помощью «ob_implicit_flush(true)».

8 голосов
/ 25 сентября 2008
function printnow($str, $bbreak=true){
    print "$str";
    if($bbreak){
        print "<br />";
    }
    ob_flush(); flush();
}

Очевидно, что это не будет вести себя, если вы передадите ему сложные объекты (или, по крайней мере, те, которые не реализуют __toString), но вы поняли идею.

2 голосов
/ 25 сентября 2008

Как отмечали другие, есть места, где что-то может зависнуть, кроме PHP (например, веб-сервер или браузер клиента). Если вы действительно хотите, чтобы информация отображалась по мере ее появления, вам, вероятно, понадобится какое-нибудь решение на основе AJAX. У вас будет один PHP-скрипт, который обрабатывает отображение, и другой, который выполняет вычисления, и вы хотите, чтобы скрипт отображения делал AJAX-запросы к другому. jQuery имеет несколько довольно простых функций AJAX, которые могут вам в этом помочь.

Вы также хотели бы иметь запасной вариант в случае, если браузер не поддерживает / отключил JavaScript, который будет просто стандартной страницей, которая может не отображать контент до конца.

1 голос
/ 26 сентября 2008

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

header('Cache-Control: no-cache, no-store, max-age=0, must-revalidate');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
header('Pragma: no-cache');
1 голос
/ 25 сентября 2008

Вы можете позвонить flush() в PHP , но есть несколько других мест, в которых вывод может храниться (например, на веб-сервере). Если вы используете буферизацию вывода, вам также необходимо вызвать ob_flush().

Вы также можете обнаружить, что некоторые браузеры не будут отображать страницу до тех пор, пока HTML-код не будет действительным, чего не будет, пока все теги не будут закрыты (например, body, html)

0 голосов
/ 25 сентября 2008

Я бы предложил использовать AJAX.

0 голосов
/ 25 сентября 2008

flush () является частью ответа. Однако, по крайней мере, год назад, использование Flush было ненадежным в Safari. В зависимости от вашего сценария, я бы искал решения, включающие JavaScript. Возможно, в различных реализациях индикаторов выполнения есть код / ​​идеи, которые вы можете переработать.

0 голосов
/ 25 сентября 2008

Начните расследование здесь:

http://httpd.apache.org/docs/1.3/misc/FAQ-F.html#nph-scripts

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...