Statement on glibc/iconv Vulnerability

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

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

Буферизация, влияющая на PHP

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

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

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

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

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

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

add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top