В чем разница между ob_flush()
и flush()
и почему я должен звонить обоим?
В ob_flush()
ссылке говорится:
Эта функция отправит содержимое выходного буфера (если есть).
В flush()
ссылке говорится:
Очищает буферы записи PHP и любой серверной части PHP (CGI, веб-сервер и т. Д.).
Однако он продолжает говорить:
[он] не сможет изменить схему буферизации вашего веб-сервера ...
Так что мне кажется, что я мог бы использовать ob_flush()
все время. Однако при этом я получаю странные результаты. Может ли кто-нибудь простыми словами объяснить, что здесь происходит?
output_buffering
параметр конфигурации, значение которого по умолчанию в производственных версиях php.ini равно 4096. Это означает, что при запуске любого PHP-скрипта первые 4096 байт вывода буферизуются (в буфере, который можно очиститьob_flush()
). Вот почему необходимо использоватьob_flush()
такжеflush()
. Отключениеoutput_buffering
через php.ini, вызовob_end_clean()
илиob_end_flush()
запуск скрипта устраняет эту необходимость.ob_end_clean()
в "начале скрипта" кажется нелогичным . Вы имеете в виду, что мы должны включить это сразу послеob_start()
и до двух промывок?ob_start()
иob_end_clean()
в самом начале сценария. Затем, после любого «эха» во время сценария, я также включаюob_flush(); flush();
и ожидаю, что пока сценарий требует времени, все, что было сделано до сих пор, будет выводиться на экран (в браузере). Но ничего не выложено до самого конца. Что мне не хватает?ob_flush
очищает выходные буферы , созданные с помощью такой функции, какob_start
flush
сбрасывает буферизованный вывод самого скрипта PHP вызывающей сторонеисточник
ob_flush()
это флеш высокого уровня. Он очищает буферы высокого уровня и помещает весь контент во внутренние буферы низкого уровня, готовые к отправке.ob_
семейство функций создает стеки буферов, поэтому простая слепая записьob_flush()
повсюду действительно даст вам «странные результаты», если код был написан для использования этого стекирования.flush()
это низкоуровневый сброс, инструктирующий PHP очистить внутренние низкоуровневые буферы данных.Ниже этого уровня будут буферы уровня сокетов; ниже находятся буферы сетевого уровня. И, на самом низком уровне, очередь электронов, идущих по кабелю данных.
источник
ob_start()
иob_end_clean()
в самом начале сценария. Затем, после любого «эха» во время сценария, я также включаюob_flush(); flush();
и ожидаю, что пока сценарий требует времени, все, что было сделано до сих пор, будет выводиться на экран (в браузере). Но ничего не выложено до самого конца. Что мне не хватает?Я думаю, это связано с вашим предыдущим вопросом . Существенным преимуществом использования буферизации вывода является то, что она используется вместе со сжатием данных. Если вы не употребляете
ob_gzhandler
, ничего не добьетесь.flush
в одиночку просто зафиксирует все выходные данные, которые все еще находятся на сервере. Withob_start
и его аналогиob_flush
,ob_end_clean
иob_end_flush
все, что ожидает сжатия (посмотритеflush
иob_flush
как относится к разным корзинам -ob
отправляет данныеflush
,flush
отправляет данные в браузер - может быть неточным, но это идея) будет упаковано и отправлено клиенту .источник