Без буферизации вывода (по умолчанию) ваш HTML отправляется в браузер по частям, когда PHP обрабатывает ваш скрипт. С помощью буферизации вывода ваш HTML хранится в переменной и отправляется в браузер как одна часть в конце вашего скрипта.
Преимущества буферизации вывода для веб-разработчиков
Включение только буферизации вывода уменьшает время, необходимое для загрузки и рендеринга нашего HTML, потому что он не отправляется браузеру по частям, поскольку PHP обрабатывает HTML.
Все причудливые вещи, которые мы можем сделать со строками PHP, теперь мы можем сделать со всей нашей HTML-страницей как одной переменной.
Если вы когда-либо сталкивались с сообщением «Предупреждение: невозможно изменить информацию заголовка - заголовки, уже отправленные (выходные данные)» при настройке файлов cookie, вы будете рады узнать, что буферизация вывода - это ваш ответ.
+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 сохранял весь вывод в буфер и выводил все сразу, улучшая производительность сети.
Вы можете получить доступ к содержимому буфера, не отправляя его обратно в браузер в определенных ситуациях.
Здесь тот же вопрос, что и для 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 printor 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 OutputBufferingControl; functions.;PossibleValues:;On=Enabledand buffer is unlimited.(Usewith caution);Off=Disabled;Integer=Enables the buffer and sets its maximum size in bytes.;Note:This directive is hardcoded to Offfor the CLI SAPI
;DefaultValue:Off;DevelopmentValue:4096;ProductionValue: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.
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()самом деле отправляем буфер не на выход, а на родительский буфер. И только при отсутствии родительского буфера содержимое отправляется в браузер или терминал.
ОБНОВЛЕНИЕ 2019. Если у вас есть выделенный сервер и SSD или лучше NVM, 3,5 ГГц. Вы не должны использовать буферизацию для ускорения загрузки сайта за 100-150 мс.
Потому что сеть работает медленнее, чем выполнение сценария в 2019 году с производительными серверами (серверами, памятью, диском) и включением APC PHP :). Для создания сценария иногда требуется всего 70 мсек, в другой раз требуется только время сети, от 10 мс до 150 мс от расположенного пользователь-сервер.
так что если вы хотите быть быстрыми 150 мс, буферизация замедляется, потому что нужны дополнительные буферы сбора данных, это требует дополнительных затрат. 10 лет назад, когда сервер делал скрипт 1с, это было полезно.
Пожалуйста, будьте осторожны, если у output_buffering есть ограничение, если вы хотите использовать jpg для загрузки, это может привести к сбоям при автоматизации и сбое отправки.
Приветствия.
Вы можете сделать быструю реку или Вы можете сделать безопасно таму :)
ob_start()
, действительно все буферизуется есть необязательный второй параметр toob_start()
,int $chunk_size
который, если установлен, заставит буфер очищаться после любого выходного вызова, который заставляет длину буфера равняться или превышать этот размер.Выходная буферизация используется PHP для повышения производительности и выполнения нескольких трюков.
Вы можете сделать так, чтобы PHP сохранял весь вывод в буфер и выводил все сразу, улучшая производительность сети.
Вы можете получить доступ к содержимому буфера, не отправляя его обратно в браузер в определенных ситуациях.
Рассмотрим этот пример:
Приведенный выше пример записывает выходные данные в переменную, а не отправляет их в браузер. output_buffering по умолчанию отключен.
Рассмотрим этот пример:
источник
ob_flush()
илиob_end_flush()
). Содержимое буфера также сбрасывается, когда ваш скрипт завершается, внезапно или иначе, поэтому проблем не должно быть.Я знаю, что это старый вопрос, но я хотел написать свой ответ для визуальных учеников. Я не смог найти диаграмм, объясняющих буферизацию вывода во всемирной сети, поэтому я сам сделал диаграмму в Windows
mspaint.exe
.Если выходная буферизация отключена,
echo
данные сразу отправляются в браузер.Если выходная буферизация включена, то
echo
перед отправкой в браузер данные отправляются в выходной буфер.phpinfo
Чтобы увидеть, включена ли буферизация вывода, обратитесь к phpinfo в разделе ядра.
output_buffering
Директива сообщит вам , если Буферизация вывода вкл / выкл.В этом случае
output_buffering
значение равно 4096, что означает, что размер буфера равен 4 КБ. Это также означает, что на веб-сервере включена буферизация вывода.php.ini
Можно включить / выключить и изменить размер буфера, изменив значение
output_buffering
директивы. Просто найдите егоphp.ini
, измените настройку по своему выбору и перезапустите веб-сервер. Вы можете найти образец моегоphp.ini
ниже.Директива
output_buffering
- не единственная конфигурируемая директива относительно буферизации вывода. Вы можете найти другие настраиваемые директивы буферизации вывода здесь: http://php.net/manual/en/outcontrol.configuration.phpПример: ob_get_clean ()
Ниже вы можете увидеть, как захватить
echo
и манипулировать им перед отправкой в браузер.Примеры: Hackingwithphp.com
Более подробную информацию о буфере вывода с примерами можно найти здесь:
http://www.hackingwithphp.com/13/0/0/output-buffering
источник
http://php.net/manual/en/book.outcontrol.php
Больше ресурсов:
Буферизация вывода с помощью PHP
источник
Как следует из названия, здесь используется буфер памяти для управления отображением вывода скрипта.
Вот один очень хороший учебник по теме
источник
Буферы могут быть вложенными, поэтому, когда один буфер активен, другой
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 для загрузки, это может привести к сбоям при автоматизации и сбое отправки.
Приветствия.
Вы можете сделать быструю реку или Вы можете сделать безопасно таму :)
источник