Является ли ob_start()
использовать для output buffering
так, чтобы заголовки в буфер и не передаются в браузер? Имею ли я здесь смысл? Если нет, то почему мы должны использовать ob_start()
?
php
output-buffering
Адитья Шукла
источник
источник
ob_get_contents()
сob_get_clean()
и удалить ,ob_end_clean()
так как поob_get_clean()
существу , выполняет обе функции. Ссылка: php.net/manual/en/function.ob-get-clean.php (PHP 4> = 4.3.0, PHP 5)ob_start();
Это правильно? Что произойдет, если он не включен?ob_end_clean
ним работает как шарм! Спасибо @Riley ДаттонЯ использую это, чтобы вырваться из PHP с большим количеством HTML, но не отображать его. Это спасает меня от сохранения в виде строки, которая отключает цветовое кодирование IDE.
Вместо того:
источник
ob_get_clean()
, а неob_end_clean()
Принятый ответ здесь описывает, что
ob_start()
делает, а не почему он используется (который был задан вопрос).Как указано в другом месте,
ob_start()
создается буфер, в который записывается вывод.Но никто не упомянул, что в PHP можно размещать несколько буферов. Смотрите ob_get_level ().
Что касается того, почему ....
Отправка HTML-кода в браузер большими порциями дает выигрыш в производительности благодаря уменьшению нагрузки на сеть.
Передача данных из PHP большими блоками дает выигрыш в производительности и емкости за счет уменьшения количества необходимых переключений контекста
Передача больших массивов данных в mod_gzip / mod_deflate дает выигрыш в производительности, поскольку сжатие может быть более эффективным.
буферизация вывода означает, что вы все еще можете манипулировать заголовками HTTP позже в коде
явное очищение буфера после вывода [head] .... [/ head] может позволить браузеру начать маршалинг других ресурсов для страницы до завершения потока HTML.
Захват вывода в буфер означает, что он может быть перенаправлен на другие функции, такие как электронная почта, или скопирован в файл в качестве кэшированного представления содержимого.
источник
У тебя это задом наперед. ob_start не буферизует заголовки, он буферизует содержимое. Использование
ob_start
позволяет вам хранить содержимое в буфере на стороне сервера, пока вы не будете готовы его отобразить.Это обычно используется для того, чтобы страницы могли отправлять заголовки после того, как они «отправили» уже некоторый контент (то есть, решили перенаправить на полпути при рендеринге страницы).
источник
Я предпочитаю:
источник
это для дальнейшего уточнения JD Isaaks ответ ...
Проблема, с которой вы часто сталкиваетесь, заключается в том, что вы используете php для вывода html из разных источников php, и эти источники часто по какой-либо причине выводятся разными способами.
Иногда у вас есть буквальный HTML-контент, который вы хотите напрямую выводить в браузер; в других случаях вывод создается динамически (на стороне сервера).
Динамический контент всегда (?) Будет строкой. Теперь вам нужно объединить этот строковый динамический html с любым буквальным html, предназначенным для непосредственного отображения ... в одну значимую структуру html-узла.
Это обычно вынуждает разработчика заключать весь этот контент для отображения в строку (как обсуждал JD Isaak), чтобы его можно было правильно доставлять / вставлять в сочетании с динамическим html ... даже если вы на самом деле этого не делаете хочу обернуть.
Но, используя методы ob _ ##, вы можете избежать этой путаницы. Литеральное содержимое вместо этого выводится в буфер. Затем одним простым шагом все содержимое буфера (все ваши литералы html) объединяются в вашу строку dynamic-html.
(Мой пример показывает, что литеральный html выводится в буфер, который затем добавляется в html-строку ... посмотрите также на пример JD Isaaks, чтобы увидеть string-wrapping-of-html).
источник
Эта функция не только для заголовков. Вы можете сделать много интересного с этим. Пример: вы можете разбить свою страницу на разделы и использовать ее следующим образом:
Вы можете захватить сгенерированный здесь вывод и добавить его в двух совершенно разных местах макета.
источник
Следующие вещи не упомянуты в существующих ответах: Конфигурация размера буфера HTTP Header и Nesting.
Настройка размера буфера для ob_start:
Приведенный выше код повышает производительность сервера, так как PHP будет отправлять большие куски данных, например, 4 КБ (без вызова ob_start, php отправляет каждое эхо-сообщение в браузер).
Если вы начнете буферизацию без размера чанка (т.е. простого ob_start ()), то страница будет отправлена один раз в конце скрипта.
Буферизация вывода не влияет на заголовки HTTP, они обрабатываются по-разному. Однако из-за буферизации вы можете отправлять заголовки даже после того, как выходные данные были отправлены, потому что они все еще находятся в буфере.
Хорошо объяснено здесь: https://phpfashion.com/everything-about-output-buffering-in-php
источник
Нет, вы не правы, но направление подходит;)
Буферизация вывода буферизует вывод скрипта. Вот (короче) все после
echo
илиprint
. Проблема с заголовками в том, что они могут быть отправлены, только если они еще не отправлены. Но HTTP говорит, что заголовки - это самая первая передача. Поэтому, если вы выводите что-то впервые (в запросе), заголовки отправляются, и вы не можете устанавливать другие заголовки.источник