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

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`, только сбросят вывод

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