Ответы:
Буферизация вывода для веб-разработчиков, руководство для начинающих :
Без буферизации вывода (по умолчанию) ваш HTML отправляется в браузер по частям, когда PHP обрабатывает ваш скрипт. С помощью буферизации вывода ваш HTML хранится в переменной и отправляется в браузер как одна часть в конце вашего скрипта.
Преимущества буферизации вывода для веб-разработчиков
- Включение только буферизации вывода уменьшает время, необходимое для загрузки и рендеринга нашего HTML, потому что он не отправляется браузеру по частям, поскольку PHP обрабатывает HTML.
- Все причудливые вещи, которые мы можем сделать со строками PHP, теперь мы можем сделать со всей нашей HTML-страницей как одной переменной.
- Если вы когда-либо сталкивались с сообщением «Предупреждение: невозможно изменить информацию заголовка - заголовки, уже отправленные (выходные данные)» при настройке файлов cookie, вы будете рады узнать, что буферизация вывода - это ваш ответ.
ob_start()
, действительно все буферизуется есть необязательный второй параметр to ob_start()
, int $chunk_size
который, если установлен, заставит буфер очищаться после любого выходного вызова, который заставляет длину буфера равняться или превышать этот размер.
Выходная буферизация используется 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 );
}
?>
ob_flush()
или ob_end_flush()
). Содержимое буфера также сбрасывается, когда ваш скрипт завершается, внезапно или иначе, поэтому проблем не должно быть.
Я знаю, что это старый вопрос, но я хотел написать свой ответ для визуальных учеников. Я не смог найти диаграмм, объясняющих буферизацию вывода во всемирной сети, поэтому я сам сделал диаграмму в 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
Более подробную информацию о буфере вывода с примерами можно найти здесь:
Функции управления выводом позволяют контролировать отправку вывода из сценария. Это может быть полезно в нескольких различных ситуациях, особенно если вам нужно отправить заголовки в браузер после того, как ваш скрипт начал выводить данные. Функции управления выводом не влияют на заголовки, отправляемые с использованием 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
ОБНОВЛЕНИЕ 2019. Если у вас есть выделенный сервер и SSD или лучше NVM, 3,5 ГГц. Вы не должны использовать буферизацию для ускорения загрузки сайта за 100-150 мс.
Потому что сеть работает медленнее, чем выполнение сценария в 2019 году с производительными серверами (серверами, памятью, диском) и включением APC PHP :). Для создания сценария иногда требуется всего 70 мсек, в другой раз требуется только время сети, от 10 мс до 150 мс от расположенного пользователь-сервер.
так что если вы хотите быть быстрыми 150 мс, буферизация замедляется, потому что нужны дополнительные буферы сбора данных, это требует дополнительных затрат. 10 лет назад, когда сервер делал скрипт 1с, это было полезно.
Пожалуйста, будьте осторожны, если у output_buffering есть ограничение, если вы хотите использовать jpg для загрузки, это может привести к сбоям при автоматизации и сбое отправки.
Приветствия.
Вы можете сделать быструю реку или Вы можете сделать безопасно таму :)