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

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

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

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

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

 function printnow($str, $bbreak=true){ print "$str"; if($bbreak){ print "<br />"; } ob_flush(); flush(); } 

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

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

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

Включение неявного флеша, как указано в 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'); 

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

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

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

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

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

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