Что такое буферизация вывода?

Что такое буферизация вывода и почему она используется в PHP?

Ответ 1

Буферизация вывода для веб-разработчиков, руководство для начинающих:

Без буферизации вывода (по умолчанию) ваш HTML отправляется в браузер по частям, так как PHP обрабатывает ваш script. С буферизацией вывода ваш HTML хранится в переменной и отправляется в браузер как одна часть в конце вашего script.

Преимущества буферизации вывода для веб-разработчиков

  • Включение только буферизации вывода уменьшает время, затрачиваемое на загрузку и визуализацию нашего HTML, поскольку оно не отправляется в браузер в виде PHP, обрабатывающего HTML.
  • Все фантазии, которые мы можем делать с строками PHP, теперь можем сделать с нашей всей HTML-страницей как одну переменную.
  • Если вы когда-либо сталкивались с сообщением "Предупреждение: не удается изменить информацию заголовка - заголовки, уже отправленные (вывод)" при настройке файлов cookie, вы с удовольствием узнаете, что буферизация вывода - это ваш ответ.

Ответ 2

Буферизация вывода используется PHP для повышения производительности и выполнения нескольких трюков.

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

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

Рассмотрим следующий пример:

<?php
    ob_start( );
    phpinfo( );
    $output = ob_get_clean( );
?>

В приведенном выше примере захватывается вывод в переменную вместо отправки в браузер. output_buffering отключен по умолчанию.

  • Вы можете использовать буферизацию вывода в ситуациях, когда вы хотите изменить заголовки после отправки содержимого.

Рассмотрим следующий пример:

<?php
    ob_start( );
    echo "Hello World";
    if ( $some_error )
    {
        header( "Location: error.php" );
        exit( 0 );
    }
?>

Ответ 3

Функции управления выходом позволяют для управления, когда вывод отправляется из script. Это может быть полезно в несколько разных ситуаций, особенно если вам нужно отправлять заголовки в браузере после того, как ваш scriptначал выводить данные. Выход Функции управления не влияют заголовки, отправленные с использованием заголовка() или setcookie(), только функции, такие как echo() и данные между блоками PHP код.

http://php.net/manual/en/book.outcontrol.php

Дополнительные ресурсы:

Буферизация вывода с PHP

Ответ 4

Я знаю, что это старый вопрос, но я хотел написать свой ответ для визуальных учеников. Я не смог найти диаграмм, объясняющих буферизацию вывода во всемирной сети, поэтому я сам что-то сделал в mspaint.

Если выходная буферизация отключена, то echo немедленно отправит данные в браузер.

enter image description here

Если выходная буферизация включена, то echo отправит данные в выходной буфер перед отправкой в браузер.

enter image description here

phpinfo

Чтобы увидеть, включена ли буферизация вывода, обратитесь к phpinfo в разделе ядра. Директива output_buffering сообщит вам, output_buffering ли буферизация вывода.

enter image description here В этом случае значение output_buffering равно 4096, что означает, что размер буфера равен 4 КБ. Это также означает, что на веб-сервере включена буферизация вывода.

php.ini

Можно включить/выключить и изменить размер буфера, изменив значение директивы output_buffering. Просто найдите его в php.ini, измените настройку по вашему выбору и перезапустите веб-сервер. Вы можете найти образец моего php.ini ниже.

; Output buffering is a mechanism for controlling how much output data
; (excluding headers and cookies) PHP should keep internally before pushing that
; data to the client. If your application output exceeds this setting, PHP
; will send that data in chunks of roughly the size you specify.
; Turning on this setting and managing its maximum buffer size can yield some
; interesting side-effects depending on your application and web server.
; You may be able to send headers and cookies after you've already sent output
; through print or echo. You also may see performance benefits if your server is
; emitting less packets due to buffered output versus PHP streaming the output
; as it gets it. On production servers, 4096 bytes is a good setting for performance
; reasons.
; Note: Output buffering can also be controlled via Output Buffering Control
;   functions.
; Possible Values:
;   On = Enabled and buffer is unlimited. (Use with caution)
;   Off = Disabled
;   Integer = Enables the buffer and sets its maximum size in bytes.
; Note: This directive is hardcoded to Off for the CLI SAPI
; Default Value: Off
; Development Value: 4096
; Production Value: 4096
; http://php.net/output-buffering
output_buffering = 4096

Директива output_buffering не является единственной настраиваемой директивой, касающейся буферизации вывода. Вы можете найти другие настраиваемые директивы буферизации вывода здесь: http://php.net/manual/en/outcontrol.configuration.php

Пример: ob_get_clean()

Ниже вы можете увидеть, как захватить echo и манипулировать им перед отправкой в браузер.

// Turn on output buffering  
ob_start();  

echo 'Hello World';  // save to output buffer

// Get content which is in the output buffer ...  
// ... and delete output buffer  
$output = ob_get_clean();  
$output = strtoupper($output); // manipulate the output  

echo $output;  // send to output stream / Browser

// OUTPUT:  
HELLO WORLD

Примеры: Hackingwithphp.com

Более подробную информацию о буфере вывода с примерами можно найти здесь:

http://www.hackingwithphp.com/13/0/0/output-buffering

Ответ 5

Как следует из названия, здесь используется буфер памяти, используемый для управления выходом вывода script.

Вот один очень хороший учебник для темы

Ответ 6

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

Буферы могут быть вложенными, поэтому, когда один буфер активен, другой ob_start() активирует новый буфер. Таким образом, ob_end_flush() и ob_flush() на самом деле отправляют буфер не на выход, а на родительский буфер. И только при отсутствии родительского буфера содержимое отправляется в браузер или терминал.

Хорошо объяснено здесь: https://phpfashion.com/everything-about-output-buffering-in-php

Ответ 7

ОБНОВЛЕНИЕ 2019. Если у вас есть выделенный сервер и SSD или лучше NVM, 3,5 ГГц. Вы не должны использовать буферизацию для ускорения загрузки сайта за 100-150 мс.

Потому что сеть работает медленнее, чем выполнение сценария в 2019 году с производительными серверами (серверами, памятью, диском) и включением APC PHP :). Для создания сценария иногда требуется всего 70 мсек, в другой раз требуется только время сети, от 10 мс до 150 мс от расположенного пользователь-сервер.

так что если вы хотите быть быстрыми 150 мс, буферизация замедляется, потому что требуются дополнительные данные буфера сбора, это требует дополнительных затрат. 10 лет назад, когда сервер делал скрипт 1с, это было полезно.

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

Приветствия.

Вы можете сделать быструю реку или Вы можете сделать безопасно таму :)