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(), который либо прекращает сохранение вещей и отбрасывает все, что было сохранено, либо прекращает сохранение и выходы все сразу, соответственно.
Я использую это, чтобы я мог вырваться из PHP с большим количеством HTML, но не визуализировать его. Это избавляет меня от хранения его в виде строки, которая отключает цветовое кодирование.
<?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_start()делает-не то, почему он используется (который был задан вопрос).как указано в другом месте
ob_start()создает буфер, в который записывается вывод.но никто не упоминал, что в PHP можно складывать несколько буферов. Смотрите ob_get_level().
зачем....
отправка HTML в браузер большими кусками дает преимущество в производительности от a уменьшенные накладные расходы сети.
передача данных из PHP в больших кусках дает преимущество в производительности и емкости за счет уменьшения количества требуемых переключателей контекста
передача больших кусков данных в mod_gzip / mod_deflate дает преимущество производительности в том, что сжатие может быть более эффективным.
буферизация вывода означает, что вы все еще можете манипулировать заголовками HTTP позже код
явно промывка буфер после вывода [head]....[/head] может позволить браузеру начать маршалинг других ресурсов для страницы до завершения потока HTML.
захват вывода в буфер означает, что он может быть перенаправлен на другие функции, такие как электронная почта, или скопирован в файл в виде кэшированного представления содержимого
у вас все наоборот. 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) объединяется в вашу динамическую строку 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.';вы можете захватить выход, который создается здесь и добавить его в двух совершенно разных местах в макете.
нет, вы ошибаетесь, но направление подходит ;)
буферизация вывода буферизует вывод скрипта. Вот (короче) все после
echoили
такие вещи не упоминаются в существующих ответов : Настройки размера буфера заголовок 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 (вызов wihout 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
Comments