Выводит 'string', пока каждая итерация длинного цикла (flush () не работает) - PullRequest
18 голосов
/ 02 июля 2011

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

echo "Hello!";

flush();

for($i = 0; $i < 10; $i ++) {
    echo $i;
    //5-10 sec execution time
    flush();
}

Это не отображает эхо, пока весь сценарий не будет завершен. Что пошло не так?

Ответы [ 7 ]

20 голосов
/ 10 июля 2011

Из руководства по PHP:

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

echo "Hello!";
flush();
ob_flush();

for($i = 0; $i < 10; $i ++) {
    echo $i;
    //5-10 sec execution time
    flush();
    ob_flush();
}

или вы можете очистить и отключить буферизацию

<?php
//Flush (send) the output buffer and turn off output buffering
while (ob_get_level() > 0)
    ob_end_flush();

echo "Hello!";

for($i = 0; $i < 10; $i ++) {
    echo $i . "\r\n";
}

?>
4 голосов
/ 19 сентября 2014

попробуйте

while (@ob_end_flush());      
ob_implicit_flush(true);

echo "first line visible to the browser";
echo str_pad("",1024," ");
echo "<br />";

sleep(5);

echo "second line visible to the browser after 5 secs";

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

3 голосов
/ 23 сентября 2015

Убедитесь, что вы сначала делаете:

@ini_set('zlib.output_compression', 0); @ini_set('implicit_flush', 1); @ob_end_clean();

, а затем просто flush(); каждый раз, когда вам нужно вывести свои эхо-сигналы в браузер.

1 голос
/ 16 марта 2019

Добавьте это в заголовок скрипта:

ob_start();
ob_implicit_flush();

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

ob_start();
define(DEBUG, 1);

if(DEBUG){
    ob_implicit_flush();
}
1 голос
/ 10 июля 2011

В общем, желаемое поведение невозможно - это детерминированный / стабильный способ с использованием чистого PHP и HTML.

Если и как браузер отображает частичную страницу, зависит от браузера, прокси и кеши.Таким образом, даже если материал работает на вашем тестовом компьютере, вполне вероятно, что он не работает в вашей производственной системе.

Библиотека xAjax предоставляет хорошо интегрированное решение для управленияОбновления в стиле AJAX с PHP .Хотя xAjax может быть мертвым как проект (по крайней мере, сейчас), он все равно работает нормально.

0 голосов
/ 09 апреля 2018

Также убедитесь, что сначала выводится заголовок Content-type.Промывка не работает для меня без:

header( 'Content-type: text/html; charset=utf-8' );
for($i=0; $i<10; ++$i)  {
    echo "Loop<br />\n";
    ob_flush();
    flush();
    sleep(1);
}
0 голосов
/ 02 июля 2011

Вы также можете попробовать использовать ob_flush (), иногда для работы необходимы оба.

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