PHP буфер ob промывка() против промывки()
В чем разница между ob_flush()
и flush()
и почему я должен звонить обоим?
В ob_flush()
ссылка гласит:
Эта функция отправит содержимое выходного буфера (если таковой имеется).
В flush()
ссылка гласит:
Очищает буферы записи PHP и все, что использует PHP (CGI, веб-сервер и т. Д.).
Однако он продолжает говорить:
[он] может быть не в состоянии переопределить схема буферизации вашего веб-сервера...
Итак, мне кажется, что я мог бы просто использовать ob_flush()
все время. Однако, когда я это делаю, я получаю странные результаты. Не мог бы кто-нибудь объяснить простыми словами, что здесь происходит?
4 answers
ob_flush
отправляет буфер, инициированный приложением. В любом PHP-скрипте может быть несколько вложенных ob_start()
. ob_flush
передает текущее содержимое на верхний слой.
Сам PHP может (по своему усмотрению) буферизировать вывод. Это зависит от серверной части. Но обычно FastCGI
имеет отдельный буфер сокета. Поэтому flush()
также необходимо вызвать для отправки текущего содержимого на веб-сервер.
И теперь веб-сервер может сам реализовать другую схему буферизации (mod_deflate
или фильтр содержимого), на который вы не имеете никакого влияния. Но это бывает редко, так как его нужно настраивать специально.
В любом случае, используйте и то, и другое.
ob_flush
очищает выходные буферы , которые вы создали с помощью функции, подобной ob_start
flush
сбрасывает буферизованный вывод самого PHP-скрипта его вызывающему объекту
ob_flush()
это флеш высокого уровня. Он очищает буферы высокого уровня и помещает все содержимое во внутренние буферы низкого уровня, готовые к отправке.
- Обратите внимание, что семейство функций
ob_
создает стеки буферов, поэтому просто слепое написаниеob_flush()
везде действительно даст вам "странные результаты", если код был написан для использования этого стекирования.
flush()
является низкоуровневой очисткой, инструктирующей PHP очищать свои внутренние низкоуровневые данные буферы.
Ниже этого все еще будут буферы уровня сокетов; ниже этого есть буферы сетевого уровня. И, на самом низком уровне, очередь электронов, идущих по кабелю передачи данных.
Я предполагаю, что это связано с вашим предыдущим вопросом . Существенное преимущество использования буферизации вывода заключается в том, что она используется наряду со сжатием данных. Если вы не используете ob_gzhandler
, то мало что выиграете. flush
в одиночку просто зафиксирует все выходные данные, которые все еще находятся на сервере. С ob_start
и его аналогами ob_flush
, ob_end_clean
и ob_end_flush
, все, что ожидает сжатия (посмотрите на flush
и ob_flush
как относящиеся к разным сегментам - ob
отправляет данные в flush
, flush
посылает данные в браузер - могут быть неточными, но такова идея) будут упакованы и отправлены клиенту.