# Буферизация вывода

Буферизация вывода — временное хранение вывода перед сбросом, перед отправкой и удалением, в браузер в веб-контексте или в командную оболочку в контексте командной строки. Пока буферизация вывода активна, вывод из скрипта не отправляется, вместо этого вывод сохраняется во внутреннем буфере.

## Буферизация, которая влияет на PHP

PHP опирается на базовую программно-аппаратную инфраструктуру при сбросе вывода. Буферизация, которую реализуют консоли в командной строке (например, с буферизацией строк) или веб-серверами и браузером в веб-контексте (например, с полной буферизацией), влияет на то, когда вывод отображается конечному пользователю. Часть этих эффектов получится устранить тонкой настройкой параметров сервера и (или) выравниванием размеров буферов на разных уровнях.

## Контроль буферизации вывода в PHP

Разработчики PHP предусмотрели полностью буферизованный пользовательский буфер вывода с функциями для запуска, манипулирования и отключения буфера (бо́льшая часть ob_*-функций), и две функции для сброса базовых системных буферов (функции flush() и ob_implicit_flush()). Часть этой функциональности также устанавливают и (или) конфигурируют в настройках файла php.ini.

## Когда полезна буферизация

Буферизация вывода полезна в ситуациях, в которых буферизованный вывод изменяется или проверяется, или его переиспользуют в запросе; или когда требуется контролируемая очистка выходных данных. Конкретные сценарии работы с буферами включают:

- Кеширование результатов выполнения скриптов, которые требуют сложных вычислений или времени, например при генерации статических `HTML`-страниц
- Переиспользование сгенерированного вывода путём его отображения, сохранения в файл и (или) отправки по электронной почте
- Сброс элемента `head` — заголовка `HTML`-страницы — до отправки элемента `body` — тела страницы, чтобы разрешить браузерам загружать внешние ресурсы, пока скрипт получает доступ к базе данных или файлу, устанавливает внешнее сетевое соединение или решает другие трудоёмкие задачи. Это полезно только тогда, когда `HTTP`-код состояния нельзя изменить после отправки заголовков
- Извлечение информации из функций, которые иначе выдавали бы вывод, как это делает функция phpinfo()
- Управление выводом стороннего кода путём изменения или включения его частей (например, извлечение данных, замена слов или фраз, добавление недостающих `HTML`-тегов), или полного отказа от этого кода при конкретных условиях, например при ошибках
- Полифиллинг недоступной функциональности веб-сервера наподобие сжатия или кодирования вывода

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open