PHP буфер ob промывка() против промывки()


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

В ob_flush() ссылка гласит:

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

В flush() ссылка гласит:

Очищает буферы записи PHP и все, что использует PHP (CGI, веб-сервер и т. Д.).

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

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

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

Author: Adam Elsodaney, 2010-11-16

4 answers

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

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

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

В любом случае, используйте и то, и другое.

 65
Author: mario, 2017-02-06 19:49:32

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

flush сбрасывает буферизованный вывод самого PHP-скрипта его вызывающему объекту

 29
Author: Dan Grossman, 2010-11-16 05:30:56

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

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

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

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

 19
Author: Lightness Races in Orbit, 2011-05-21 14:39:56

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

 10
Author: stillstanding, 2017-05-23 12:10:00