Разработчики PHP предусмотрели два взаимосвязанных способа сброса (отправки и удаления содержимого) системных буферов: один — вызов функции flush(), другой — включение неявного сброса функцией ob_implicit_flush() или директивой implicit_flush в файле php.ini.
Когда неявный сброс выключен, PHP будет сбрасывать вывод, только когда вызвана функция flush() или когда скрипт завершил работу.
При включённом неявном сбросе PHP будет пытаться сбросить вывод после каждого блока кода, который выводит данные. Вывод в этом контексте — это данные ненулевой длины, которые:
<?php ?>
php://output
Замечание: Печать пустых строк или отправка заголовков не рассматривается как вывод и не приведёт к операции сброса.
Если неявный сброс включён, управляющие символы
(например, «\n»
, «\r»
,
«\0»
)
также вызовут сброс.
Функции сброса системных буферов не сбрасывают пользовательские буферы вывода. Чтобы использовать системный и пользовательский буферы вместе, пользовательские буферы вывода сбрасывают перед сбросом системных буферов, чтобы PHP вывел данные.
Не исключён риск того, что вызов функции flush() или включённый неявный сброс помешает обработчикам пользовательских буферов вывода, устанавливающим и отправляющим заголовки в веб-контексте (например, функция ob_gzhandler()), отправив заголовки до того, как их отправят обработчики.
При работе с функциями управления PHP-буфером учитывают, что PHP не умеет переопределять буферизацию, реализованную базовыми программными или аппаратными средствами. Проверка настроек буферизации веб-серверов, браузеров, консолей и работа с ними помогают устранить возникающие проблемы. При работе в веб-контексте для совместной согласованной работы регулируют настройки буферизации веб-сервера или буферизации скрипта, тогда как обойти стратегии буферизации веб-браузеров можно, настроив буферизацию в PHP-скрипте. На консолях, которые реализуют буферизацию строк, символы новой строки вставляют в нужные места перед сбросом вывода.
Хотя реализации сброса в каждом интерфейсе SAPI слегка различаются, эти реализации попадают в одну из категорий:
Apache2Handler
, CGI
,
FastCGI
и FPM
CLI
и embed
,
только сбросят вывод