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