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

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

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

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

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

Сбрасывает буферы записи PHP и того, что использует PHP для бэкэнда (CGI, веб-сервер и т. Д.).

Тем не менее, он продолжает говорить:

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

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

4 ответа

Решение

ob_flush отправляет инициированный приложением буфер. Может быть несколько вложенных ob_start()в любом скрипте PHP. 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 отправляет данные в браузер - может быть неточным, но это идея), будет завернут и отправлен клиенту.

Другие вопросы по тегам