Web

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

Что такое буферизация вывода и почему она используется в 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

Есть ли функция для извлечения «столбца» из массива в PHP?

Web

Определение размера удаленного файла без загрузки файла

Web

Передача значений массива $_POST с помощью cURL

Web

Перечисления в PHP