Сброс (отправка) системных буферов

PHP предлагает два взаимосвязанных способа сброса (отправки и удаления содержимого) системных буферов: один — вызов функции flush(), другой — включение неявного сброса функцией ob_implicit_flush() или директивой implicit_flush в файле php.ini.

Поведение сброса (отправки) вывода

Когда неявный сброс выключен, PHP будет сбрасывать вывод, только когда вызвана функция flush() или когда скрипт завершил работу.

При включённом неявном сбросе PHP будет пытаться сбросить вывод после каждого блока кода, который выводит данные. Вывод в этом контексте — это данные ненулевой длины, которые:

  • написаны за пределами тегов <?php ?>
  • выводят языковые конструкции и функции, явная цель которых — вывод пользовательских переменных или строк, как например: echo, print, printf(), var_dump(), var_export(), vprintf()
  • выводят функции, цель которых — сбор и вывод данных или информации о запущенном скрипте или PHP, как например: debug_print_backtrace(), phpcredits(), phpinfo(), ReflectionExtension::info()
  • выводит PHP при неперехваченном исключении или необработанной ошибке (при условии, что включены директивы display_errors и error_reporting)
  • записывают в поток php://output

Замечание: Печать пустых строк или отправка заголовков не рассматривается как вывод и не приведёт к операции сброса.

Внимание

Если неявный сброс включён, управляющие символы (например, «\n», «\r», «\0») также вызовут сброс.

Ограничения

Функции сброса системных буферов не сбрасывают пользовательские буферы вывода. Чтобы использовать системный и пользовательский буферы вместе, пользовательские буферы вывода сбрасывают перед сбросом системных буферов, чтобы PHP вывел данные.

Внимание

Не исключён риск того, что вызов функции flush() или включённый неявный сброс помешает обработчикам пользовательских буферов вывода, устанавливающим и отправляющим заголовки в веб-контексте (например, функция ob_gzhandler()), отправив заголовки до того, как их отправят обработчики.

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

Различия в сбросе в интерфейсах SAPI

Хотя реализации сброса в каждом интерфейсе SAPI слегка различаются, эти реализации попадают в одну из категорий:

  • Интерфейсы SAPI в веб-контексте вначале сбросят заголовки, а затем вывод. К таким SAPI относятся Apache2Handler, CGI, FastCGI и FPM
  • другие SAPI, например CLI и embed, только сбросят вывод

add a note

User Contributed Notes

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