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

Ответы:

274

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

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

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

  • Включение только буферизации вывода уменьшает время, необходимое для загрузки и рендеринга нашего HTML, потому что он не отправляется браузеру по частям, поскольку PHP обрабатывает HTML.
  • Все причудливые вещи, которые мы можем сделать со строками PHP, теперь мы можем сделать со всей нашей HTML-страницей как одной переменной.
  • Если вы когда-либо сталкивались с сообщением «Предупреждение: невозможно изменить информацию заголовка - заголовки, уже отправленные (выходные данные)» при настройке файлов cookie, вы будете рады узнать, что буферизация вывода - это ваш ответ.
Топор.
источник
6
+1. Вот еще одна полезная ссылка: php.net/manual/en/function.ob-start.php - также полезна при работе с функцией, которая отображает значение, которое вы предпочитаете хранить в переменной.
Cam
Действительно ли все буферизовано до конца, или страница будет только частями, если у меня будет действительно длинная страница?
zedoo
5
@zedoo, если вы начнете буферизовать вывод ob_start(), действительно все буферизуется есть необязательный второй параметр to ob_start(), int $chunk_sizeкоторый, если установлен, заставит буфер очищаться после любого выходного вызова, который заставляет длину буфера равняться или превышать этот размер.
топор.
12
Если вы получаете «Предупреждение: невозможно изменить информацию заголовка», это означает, что вам нужно сначала провести аудит кода, так как включение буферизации вывода - это устранение симптома, а не причина. Что-то пишет до своей очереди. Поэтому я не согласен, но не настолько, чтобы дать ответ.
Гленн Плас
5
Я вижу только преимущества использования буферизации, так почему он не включен по умолчанию в php?
Томас Бандерас
69

Выходная буферизация используется 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 );
    }
?>
Салман А
источник
Здесь тот же вопрос, что и для Ax: не запускается ли буферизация выходных данных без последующего выключения, не заставит ли ваш скрипт столкнуться с различными проблемами?
Эдвард Стамперд
1
Буфер сбрасывается при вызове одного из методов сброса (например, ob_flush()или ob_end_flush()). Содержимое буфера также сбрасывается, когда ваш скрипт завершается, внезапно или иначе, поэтому проблем не должно быть.
Салман А
17

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

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

введите описание изображения здесь

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

введите описание изображения здесь

phpinfo

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

введите описание изображения здесь В этом случае 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's 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

$output = ob_get_clean();  // Get content from the output buffer, and discard the output buffer ...
$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

юлианский
источник
9

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

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

Больше ресурсов:

Буферизация вывода с помощью PHP

Sarfraz
источник
4

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

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

Nik
источник
1
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

Sudip
источник
0

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

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

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

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

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

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

Камиль Домбровски
источник