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

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

ob_flush() говорит:

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

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

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

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

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

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

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

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

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

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

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

flush flushes буферизует вывод скрипта PHP самому вызывающему

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

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

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

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

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