В чем разница между 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
отправляет данные в браузер – может быть неточно, но это идея) будут завернуты и отправлены клиенту.