Буферизация вывода не работает должным образом?

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

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

while (...) {
    ob_start();
    // echo statements
    ob_end_flush();
}

Но это не сработало для меня. Я также пробовал это:

while (...) {
    ob_start();
    // echo statements
    ob_flush();
    flush();
    ob_end_flush();
}

Но и это не сработало. Единственное, что, кажется, работает, это:

while (...) {
    ob_end_clean();
    ob_start();
    // echo statements
    ob_flush();
    flush();
}

Почему я должен сначала вызвать ob_end_clean(), чтобы буферизация вывода заработала?


person Nate    schedule 24.07.2014    source источник


Ответы (2)


Вероятно, это зависит от остальной части вашего кода.

Для меня следующий код работает без проблем:

<?php
header( 'Content-type: text/html; charset=utf-8' );
$x = 1;

while ($x < 10) {
    echo $x."<br />";
    ob_flush();
    flush();
    sleep(1);
    ++$x;
}

Вы можете использовать ob_implicit_flush(), но вам не нужно запускать flash() каждый раз, когда вы запускаете ob_flush(), поэтому приведенный выше код можно изменить на:

<?php
header( 'Content-type: text/html; charset=utf-8' );
$x = 1;

ob_implicit_flush(true);

while ($x < 10) {
    echo $x."<br />";
    ob_flush();    
    sleep(1);
    ++$x;
}

Вы также должны посмотреть на свой header(). Если в любом из приведенных выше кодов я удалю/закомментирую строку с заголовком, все содержимое будет отображаться после завершения выполнения скриптов. Буферизация вывода не будет работать должным образом

person Marcin Nabiałek    schedule 24.07.2014
comment
У меня не было оператора header(), и я думаю, что это была проблема. Спасибо! - person Nate; 25.07.2014

Вы делаете это неправильно. Это сделает это:

while (...) {
    // echo statements
    flush();
}

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

Также обратите внимание на ob_implicit_flush, который автоматически выполняет сброс на выходе.

person Christian Gollhardt    schedule 24.07.2014