Используется ли ob_start()
для output buffering
, чтобы заголовки буферизовались и не отправлялись в браузер? Имею ли я здесь смысл? Если нет, то почему мы должны использовать ob_start()
?
Какая польза от ob_start () в php?
Ответы (9)
Думайте о ob_start()
как о высказывании: «Начни запоминать все, что обычно выводится, но пока ничего не делай с этим».
Например:
ob_start();
echo("Hello there!"); //would normally get printed to the screen/output to browser
$output = ob_get_contents();
ob_end_clean();
Есть две другие функции, с которыми вы обычно объединяете его: ob_get_contents()
, которая в основном дает вам все, что было "сохранено" в буфере с тех пор, как оно было включено с помощью ob_start()
, а затем ob_end_clean()
или ob_flush()
, которая либо останавливает сохранение, либо отбрасывает все, что было сохранено. , или перестает сохранять и выводит все сразу, соответственно.
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)
- person Con Antonakos; 20.05.2015
ob_start();
в файле .ini должна быть включена буферизация вывода. Это правильно? Что произойдет, если он не будет включен?
- person Kevin Wheeler; 14.08.2015
ob_end_clean
он работает как шарм! Спасибо @Riley Dutton
- person Martins; 14.01.2016
Я использую это, чтобы отказаться от PHP с большим количеством HTML, но не отображать его. Это избавляет меня от хранения его в виде строки, которая отключает цветовую кодировку IDE.
<?php
ob_start();
?>
<div>
<span>text</span>
<a href="#">link</a>
</div>
<?php
$content = ob_get_clean();
?>
Вместо:
<?php
$content = '<div>
<span>text</span>
<a href="#">link</a>
</div>';
?>
ob_get_clean()
, а не _ 2_
- person Blazemonger; 25.11.2013
Принятый ответ здесь описывает, что делает ob_start()
, а не почему он используется (как был задан вопрос).
Как указано в другом месте, ob_start()
создает буфер, в который записывается вывод.
Но никто не упомянул, что в PHP можно складывать несколько буферов. См. ob_get_level ().
Что касается того, почему ....
Отправка HTML в браузер более крупными фрагментами дает выигрыш в производительности за счет снижения нагрузки на сеть.
Передача данных из PHP большими порциями дает преимущество в производительности и емкости за счет уменьшения количества требуемых переключений контекста.
Передача больших блоков данных в mod_gzip / mod_deflate дает преимущество в производительности, поскольку сжатие может быть более эффективным.
буферизация вывода означает, что вы все еще можете манипулировать заголовками HTTP позже в коде
явная очистка буфера после вывода [head] .... [/ head] может позволить браузеру начать маршалинг других ресурсов для страницы до завершения потока HTML.
Захват вывода в буфер означает, что его можно перенаправить на другие функции, такие как электронная почта, или скопировать в файл в качестве кэшированного представления содержимого.
output_buffering = 200000
. В некоторых случаях, но не во всех, такое включение может быть выполнено в файле .htaccess, например: php_value output_buffering 200000
.
- person David Spector; 25.04.2021
У вас все наоборот. ob_start не буферизует заголовки, он буферизует содержимое. Использование ob_start
позволяет вам хранить контент в серверном буфере до тех пор, пока вы не будете готовы его отобразить.
Это обычно используется для того, чтобы страницы могли отправлять заголовки «после того, как они уже« отправили »некоторый контент (т. Е. Решив перенаправить на полпути во время рендеринга страницы).
Я предпочитаю:
ob_start();
echo("Hello there!");
$output = ob_get_clean(); //Get current buffer contents and delete current output buffer
это необходимо для дальнейшего разъяснения ответа JD Isaaks ...
Проблема, с которой вы часто сталкиваетесь, заключается в том, что вы используете php для вывода html из множества разных источников php, и эти источники часто по какой-либо причине выводятся разными способами.
Иногда у вас есть буквальный HTML-контент, который вы хотите напрямую вывести в браузер; в других случаях вывод создается динамически (на стороне сервера).
Динамический контент всегда (?) Будет строкой. Теперь вам нужно объединить этот строковый динамический html с любым буквальным, прямым отображаемым html ... в одну значимую структуру узлов html.
Обычно это вынуждает разработчика обернуть весь этот прямой для отображения контент в строку (как обсуждал JD Isaak), чтобы его можно было правильно доставить / вставить вместе с динамическим html ... даже если вы на самом деле этого не делаете хочу, чтобы это было завернуто.
Но, используя методы ob _ ##, вы можете избежать этого беспорядка, связанного с переносом строк. Буквальное содержимое вместо этого выводится в буфер. Затем за один простой шаг все содержимое буфера (весь ваш буквальный html) объединяется в вашу строку dynamic-html.
(Мой пример показывает, что буквальный html выводится в буфер, который затем добавляется к html-строке ... посмотрите также пример JD Isaaks, чтобы увидеть string-wrapping-of-html).
<?php // parent.php
//---------------------------------
$lvs_html = "" ;
$lvs_html .= "<div>html</div>" ;
$lvs_html .= gf_component_assembler__without_ob( ) ;
$lvs_html .= "<div>more html</div>" ;
$lvs_html .= "----<br/>" ;
$lvs_html .= "<div>html</div>" ;
$lvs_html .= gf_component_assembler__with_ob( ) ;
$lvs_html .= "<div>more html</div>" ;
echo $lvs_html ;
// 02 - component contents
// html
// 01 - component header
// 03 - component footer
// more html
// ----
// html
// 01 - component header
// 02 - component contents
// 03 - component footer
// more html
//---------------------------------
function gf_component_assembler__without_ob( )
{
$lvs_html = "<div>01 - component header</div>" ; // <table ><tr>" ;
include( "component_contents.php" ) ;
$lvs_html .= "<div>03 - component footer</div>" ; // </tr></table>" ;
return $lvs_html ;
} ;
//---------------------------------
function gf_component_assembler__with_ob( )
{
$lvs_html = "<div>01 - component header</div>" ; // <table ><tr>" ;
ob_start();
include( "component_contents.php" ) ;
$lvs_html .= ob_get_clean();
$lvs_html .= "<div>03 - component footer</div>" ; // </tr></table>" ;
return $lvs_html ;
} ;
//---------------------------------
?>
<!-- component_contents.php -->
<div>
02 - component contents
</div>
Эта функция предназначена не только для заголовков. С ним можно делать много интересного. Пример: вы можете разбить свою страницу на разделы и использовать ее следующим образом:
$someTemplate->selectSection('header');
echo 'This is the header.';
$someTemplate->selectSection('content');
echo 'This is some content.';
Вы можете записать сгенерированный здесь вывод и добавить его в два совершенно разных места вашего макета.
В существующих ответах не упоминаются следующие вещи: HTTP-заголовок и вложение конфигурации размера буфера.
Конфигурация размера буфера для ob_start:
ob_start(null, 4096); // Once the buffer size exceeds 4096 bytes, PHP automatically executes flush, ie. the buffer is emptied and sent out.
Приведенный выше код улучшает производительность сервера, поскольку PHP будет отправлять большие порции данных, например, 4KB (без вызова ob_start php будет отправлять каждое эхо в браузер).
Если вы начнете буферизацию без размера блока (например, простой ob_start ()), то страница будет отправлена один раз в конце скрипта.
Буферизация вывода не влияет на заголовки HTTP, они обрабатываются по-другому. Однако из-за буферизации вы можете отправлять заголовки даже после отправки вывода, потому что он все еще находится в буфере.
ob_start(); // turns on output buffering
$foo->bar(); // all output goes only to buffer
ob_clean(); // delete the contents of the buffer, but remains buffering active
$foo->render(); // output goes to buffer
ob_flush(); // send buffer output
$none = ob_get_contents(); // buffer content is now an empty string
ob_end_clean(); // turn off output buffering
Здесь красиво объяснено: https://phpfashion.com/everything-about-output-buffering-in-php
Нет, ошибаешься, но направление подходит;)
Буферизация вывода буферизует вывод скрипта. Это (короче) все после echo
или print
. Дело в том, что заголовки могут быть отправлены только в том случае, если они еще не отправлены. Но HTTP говорит, что заголовки - это самая первая передача. Поэтому, если вы выводите что-то впервые (в запросе), заголовки отправляются, и вы не можете установить другие заголовки.