PHP-буфер ob_flush() против flush()

В чем разница между ob_flush() и flush() и почему я должен звонить оба?

ob_flush() ссылка говорит:

Эта функция будет отправлять содержимое выходного буфера (если есть).

flush() ссылка говорит:

Сбрасывает буферы записи PHP и любые внутренние ресурсы PHP (CGI, веб-сервер и т.д.).

Однако он продолжает говорить:

[it], возможно, не сможет переопределить схему буферизации вашего веб-сервера...

Итак, мне кажется, что я мог бы просто использовать ob_flush() все время. Тем не менее, я получаю странные результаты, когда я это делаю. Может ли кто-нибудь объяснить в простых терминах, что здесь происходит?

Ответ 1

ob_flush отправляет буфер, инициированный приложением. В любом PHP script может быть несколько вложенных ob_start(). ob_flush передает текущее содержимое на верхний уровень.

Сам PHP может (по своему усмотрению) выводить буфер. Это зависит от исходного. Но обычно FastCGI имеет собственный буфер сокета. Поэтому необходимо также вызвать flush(), чтобы отправить текущий контент на веб-сервер.

И теперь веб-сервер может сам реализовать другую схему буферизации (mod_deflate или фильтр содержимого), на которую вы не влияете. Но это редко, поскольку его нужно настроить специально.

Во всяком случае, используйте оба.

Ответ 2

ob_flush очищает выходные буферы, созданные вами с помощью функции ob_start

flush выполняет сброс буферизованного вывода самого PHP script его вызывающему

Ответ 3

ob_flush() - высокоуровневый флеш. Он очищает буферы высокого уровня и помещает все содержимое в низкоуровневые внутренние буферы, готовые к отправке.

  • Обратите внимание, что семейство функций ob_ создает стопки буферов, поэтому просто слепо писать ob_flush() везде действительно даст вам "странные результаты", если бы код был написан, чтобы воспользоваться этой укладкой.

flush() - это низкоуровневый флеш, инструктирующий PHP для очистки внутренних буферов данных низкого уровня.

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

Ответ 4

Я предполагаю, что это относится к вашему предыдущему вопросу. Существенным преимуществом использования буферизации вывода является то, что оно используется наряду с сжатием данных. Если вы не используете ob_gzhandler, получить немного. Только flush просто фиксирует все выходные данные на сервере. С ob_start и его аналогами ob_flush, ob_end_clean и ob_end_flush все, что ожидает сжатия (смотрите flush и ob_flush как ссылающиеся на разные ковши - ob отправляет данные в flush, flush отправляет данные в браузер - может быть неточно, но эта идея) будет завершена и отправлена ​​клиенту.