Что такое выходная буферизация?
Что такое буферизация вывода и почему ее используют в PHP?
9 ответов
Буферизация вывода для веб-разработчиков, руководство для начинающих:
Без буферизации вывода (по умолчанию) ваш HTML отправляется в браузер по частям, когда PHP обрабатывает ваш скрипт. С помощью буферизации вывода ваш HTML хранится в переменной и отправляется в браузер как одна часть в конце вашего скрипта.
Преимущества буферизации вывода для веб-разработчиков
- Включение только буферизации вывода уменьшает время, необходимое для загрузки и рендеринга нашего HTML, потому что он не отправляется в браузер по частям, поскольку PHP обрабатывает HTML.
- Все причудливые вещи, которые мы можем сделать со строками PHP, теперь мы можем сделать со всей нашей HTML-страницей как одной переменной.
- Если вы когда-либо сталкивались с сообщением "Предупреждение: невозможно изменить информацию заголовка - заголовки, уже отправленные (выходные данные)" при настройке файлов cookie, вы будете рады узнать, что буферизация вывода - это ваш ответ.
Выходная буферизация используется 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 );
}
?>
Я знаю, что это старый вопрос, но я хотел написать свой ответ для визуальных учеников. Я не смог найти диаграмм, объясняющих буферизацию вывода во всемирной сети, поэтому я сам что-то сделал в mspaint.
Если выходная буферизация отключена, то 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
// 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
Более подробную информацию о буфере вывода с примерами можно найти здесь:
Функции управления выводом позволяют контролировать отправку вывода из сценария. Это может быть полезно в нескольких различных ситуациях, особенно если вам нужно отправить заголовки в браузер после того, как ваш скрипт начал выводить данные. Функции управления выводом не влияют на заголовки, отправляемые с использованием header() или setcookie(), только на функции, такие как echo() и данные между блоками кода PHP.
http://php.net/manual/en/book.outcontrol.php
Больше ресурсов:
Как следует из названия, здесь используется буфер памяти, используемый для управления выводом скрипта.
Вот один очень хороший учебник по теме
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
Это краткое описание буферизации вывода в php. (XAMPP php.ini)
Буферизация вывода — это механизм контроля того, сколько выходных данных (за исключением заголовков и файлов cookie) PHP должен хранить внутри, прежде чем отправлять эти данные клиенту. Если выходные данные вашего приложения превышают этот параметр, PHP будет отправлять эти данные фрагментами примерно указанного вами размера. Включение этого параметра и управление максимальным размером буфера может привести к некоторым интересным побочным эффектам в зависимости от вашего приложения и веб-сервера. Возможно, вы сможете отправлять заголовки и файлы cookie после того, как вы уже отправили вывод через печать или эхо. Вы также можете увидеть преимущества в производительности, если ваш сервер отправляет меньше пакетов из-за буферизованного вывода по сравнению с потоковой передачей вывода PHP по мере его получения. На производственных серверах 4096 байт — это хороший параметр из соображений производительности.
Примечание. Буферизацией вывода также можно управлять с помощью функций управления буферизацией вывода.
Возможные значения:
On = включено и буфер не ограничен. (Используйте с осторожностью)
Выкл. = Отключено
Integer = включает буфер и устанавливает его максимальный размер в байтах.
Примечание. Эта директива жестко запрограммирована на Off для CLI SAPI.
Значение по умолчанию: Выкл.
Значение развития: 4096
Стоимость производства: 4096
http://php.net/output-bufferingoutput_buffering=4096
ОБНОВЛЕНИЕ 2019. Если у вас есть выделенный сервер и SSD или лучше NVM, 3,5 ГГц. Вы не должны использовать буферизацию для ускорения загрузки сайта за 100-150 мс.
Потому что сеть работает медленнее, чем выполнение сценария в 2019 году с производительными серверами (серверами, памятью, диском) и включением APC PHP:). Для создания сценария иногда требуется всего 70 мсек, в другой раз требуется только время сети, от 10 мс до 150 мс от расположенного пользователь-сервер.
так что если вы хотите быть быстрыми 150 мс, буферизация замедляется, потому что требуются дополнительные данные буфера сбора, это требует дополнительных затрат. 10 лет назад, когда сервер делал скрипт 1с, это было полезно.
Пожалуйста, будьте осторожны, если у output_buffering есть ограничение, если вы хотите использовать jpg для загрузки, это может привести к сбоям при автоматизации и сбое отправки.
Приветствия.
Вы можете сделать быструю реку или Вы можете сделать безопасно таму:)
Функция буферизации вывода также принимает функцию обратного вызова.
Вы можете увидеть код ниже. Есть функцияcallback
который принимает аргумент. Здесь$buffer
— это строка, содержащая содержимое изob_start()
кob_end_flush()
.
<?php
function callback($buffer)
{
// it will replace football with cricket
return (str_replace("football", "cricket", $buffer));
}
ob_start("callback");
?>
<html>
<body>
<p>It like football.</p>
</body>
</html>
<?php
ob_end_flush();
?>
Вывод приведенного выше кода:
<html>
<body>
<p>I like cricket.</p>
</body>
</html>
Мне также нужно объяснить, что функция буферизации вывода также работает во вложенных областях. пример:
<?php
ob_start();
echo "Hello";
ob_start(); // nested ob_start()
echo "PHP";
$v1 = ob_get_contents(); // Stores "PHP" in $v1 variable.
ob_end_flush();
echo "World";
$v2 = ob_get_contents(); // Stores "Hello PHP World" in $v2 variable.
ob_end_flush();
?>