работает - буферизация вывода php




Какая польза от ob_start() в php? (6)

Используется ли ob_start() для output buffering чтобы заголовки были буферизованы и не отправлены в браузер? Имею ли я смысл? Если нет, то почему мы должны использовать ob_start() ?


В принятом ответе здесь описывается, что делает ob_start() а не почему он используется (что было задано вопросом).

Как указано в другом месте, ob_start() создает буфер, на который записывается вывод.

Но никто не упомянул, что в PHP можно складывать несколько буферов. См. ob_get_level ().

Что касается того, почему ....

  1. Отправка HTML в браузер в больших кусках дает преимущество в производительности из-за сокращения сетевых издержек.

  2. Передача данных из PHP в больших кусках дает преимущество производительности и емкости за счет сокращения количества требуемых контекстных переключателей

  3. Передача больших фрагментов данных в mod_gzip / mod_deflate дает преимущество в производительности, так как сжатие может быть более эффективным.

  4. буферизация вывода означает, что вы все еще можете манипулировать заголовками HTTP позже в коде

  5. явно промывая буфер после вывода [head] .... [/ head] может позволить браузеру начать маршалинг других ресурсов для страницы до завершения потока HTML.

  6. Захват вывода в буфере означает, что он может перенаправляться на другие функции, такие как электронная почта или копироваться в файл в виде кэшированного представления содержимого


В существующих ответах не упоминаются следующие вещи: Конфигурация размера буфера HTTP Header и Nesting.

Конфигурация размера буфера для 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 call, 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


Подумайте об 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_get_contents() , которая в основном дает вам все, что было «сохранено» в буфере, поскольку оно было включено с ob_start() , а затем ob_end_clean() или ob_flush() , которые либо останавливает сохранение вещей и отбрасывает все, что было сохранено, или останавливает сохранение и выводит все сразу, соответственно.


У вас есть это в обратном направлении. ob_start не буферизирует заголовки, он буферизирует содержимое. Использование ob_start позволяет сохранять содержимое в серверном буфере, пока вы не будете готовы его отображать.

Это обычно используется для того, чтобы страницы могли отправлять заголовки после того, как они уже отправили некоторый контент (т. Е. Решили перенаправить на половину пути через визуализацию страницы).


Я использую это, чтобы я мог вырваться из 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();
echo("Hello there!");
$output = ob_get_clean(); //Get current buffer contents and delete current output buffer




output-buffering