Что такое буферизация вывода и почему она используется в PHP?
Ответ 1
Без буферизации вывода (по умолчанию) ваш HTML-код отправляется в браузер по частям по мере того, как PHP обрабатывает ваш скрипт. При буферизации вывода ваш HTML-код сохраняется в переменной и отправляется в браузер как один фрагмент в конце вашего скрипта.
Преимущества буферизации вывода для веб-разработчиков:
Включение только буферизации вывода уменьшает время, необходимое для загрузки и рендеринга вашего 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
Я знаю, что это старый вопрос, но я хотел написать свой ответ. Я не смог найти никаких диаграмм, объясняющих буферизацию вывода во всемирной сети, поэтому я сам сделал диаграмму в Windows.
Если буферизация вывода отключена, echo данные будут немедленно отправлены в браузер.
Если буферизация вывода включена, то перед отправкой в браузер echo данные будут отправляться в буфер вывода.
phpinfo
Чтобы узнать, включена или выключена буферизация вывода, обратитесь к phpinfo в разделе ядра. Директива output_buffering сообщит вам, если буферизация вывода вкл/выкл.
В этом случае значение output_buffering равно 4096, что означает, что размер буфера составляет 4 Кб. Это также означает, что на веб-сервере включена буферизация вывода.
php.ini
Можно включить/выключить и изменить размер буфера, изменив значение директивы output_buffering. Просто найдите ее в php.ini, измените настройку по вашему выбору и перезапустите веб-сервер. Вы можете посмотреть образец моего php.ini ниже.
; Буферизация вывода — это механизм для управления тем, сколько выходных данных
; (исключая заголовки и cookies) PHP должен хранить внутри себя, прежде чем передавать эти данные
; клиенту. Если объем вывода вашего приложения превышает этот параметр, PHP
; будет отправлять эти данные частями примерно того размера, который вы укажете.
; Включение этой настройки и управление максимальным размером буфера может дать некоторые
; интересные побочные эффекты в зависимости от вашего приложения и веб-сервера.
; Вы сможете отправлять заголовки и cookies после того, как уже отправили вывод.
; через print или echo. Вы также можете увидеть преимущества в производительности, если ваш сервер
; отправляет меньше пакетов из-за буферизации вывода по сравнению с потоковой передачей вывода PHP
; по мере его получения. На производственных серверах 4096 байт является хорошим значением для производительности.
; Примечание: Буферизацией вывода также можно управлять с помощью функций управления буферизацией вывода (Output Buffering Control)
; Возможные значения:
; On = Включено, буфер не ограничен. (Используйте с осторожностью)
; Off = Отключено
; Integer = Включает буфер и устанавливает его максимальный размер в байтах.
; Примечание: Для CLI SAPI эта директива имеет жесткое значение Off.
; 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 и управлять ей перед отправкой в браузер.
// Включить буферизацию вывода
ob_start();
echo 'Hello World';
$output = ob_get_clean(); // Получить содержимое из выходного буфера и отбросить выходной буфер ...
$output = strtoupper($output);
echo $output; // отправляем в выходной поток/браузер
// ВЫВОД:
HELLO WORLD
Ответ 4
ob_start(); // включает буферизацию вывода
$foo->bar(); // весь вывод идет только в буфер
ob_clean(); // удаляет содержимое буфера, но буферизация остается активной
$foo->render(); // вывод поступает в буфер
ob_flush(); // отправка буферного вывода
$none = ob_get_contents(); // содержимое буфера теперь является пустой строкой
ob_end_clean(); // отключить выходную буферизацию
Буферы могут быть вложенными, поэтому, пока один буфер активен, другой ob_start() активирует новый буфер. Таким образом, ob_end_flush() и ob_flush() на самом деле отправляют буфер не на выход, а в родительский буфер. И только при отсутствии родительского буфера содержимое отправляется в браузер или терминал.
Web