<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/book.outcontrol.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ru',
  ),
  'this' => 
  array (
    0 => 'outcontrol.user-level-output-buffers.php',
    1 => 'Пользовательские буферы вывода',
    2 => 'Пользовательские буферы вывода',
  ),
  'up' => 
  array (
    0 => 'book.outcontrol.php',
    1 => 'Контроль вывода',
  ),
  'prev' => 
  array (
    0 => 'outcontrol.flushing-system-buffers.php',
    1 => 'Сброс (отправка) системных буферов',
  ),
  'next' => 
  array (
    0 => 'outcontrol.what-output-is-buffered.php',
    1 => 'Какой вывод буферизуется?',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ru',
    'path' => 'reference/outcontrol/user-level-output-buffers.xml',
  ),
  'history' => 
  array (
  ),
  'extra_header_links' => 
  array (
    'rel' => 'alternate',
    'href' => '/manual/en/feeds/outcontrol.user-level-output-buffers.atom',
    'type' => 'application/atom+xml',
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="outcontrol.user-level-output-buffers" class="chapter">
 <h1 class="title">Пользовательские буферы вывода</h1>
<h2>Содержание</h2><ul class="chunklist chunklist_chapter"><li><a href="outcontrol.what-output-is-buffered.php">Какой вывод буферизуется?</a></li><li><a href="outcontrol.nesting-output-buffers.php">Вложенные буферы вывода</a></li><li><a href="outcontrol.buffer-size.php">Размер буфера</a></li><li><a href="outcontrol.operations-on-buffers.php">Операции, разрешённые для буферов</a></li><li><a href="outcontrol.output-handlers.php">Обработчики вывода</a></li><li><a href="outcontrol.working-with-output-handlers.php">Работа с обработчиками вывода</a></li><li><a href="outcontrol.flags-passed-to-output-handlers.php">Флаги, передаваемые обработчикам вывода</a></li><li><a href="outcontrol.output-handler-return-values.php">Значения, которые возвращает обработчик вывода</a></li></ul>

 <p class="para">
  Пользовательские буферы вывода разрешается запускать, манипулировать ими
  и завершать из PHP-кода.
  Каждый из этих буферов состоит из буфера вывода
  и функции-обработчика вывода этого буфера.
 </p>

 

 <div class="section">
  <h2 class="title">Включение буферизации вывода</h2>
  <p class="para">
   Буферизацию вывода включают вызовом функции
   <span class="function"><a href="function.ob-start.php" class="function">ob_start()</a></span>
   или установкой в файле <var class="filename">php.ini</var> параметров директивам
   <a href="outcontrol.configuration.php#ini.output-buffering" class="link">output_buffering</a>
   и <a href="outcontrol.configuration.php#ini.output-handler" class="link">output_handler</a>.
   Хотя оба способа умеют создавать буферы вывода,
   функция <span class="function"><a href="function.ob-start.php" class="function">ob_start()</a></span> гибче,
   поскольку принимает в качестве обработчиков вывода пользовательские функции
   и умеет задавать операции, разрешенные для буфера (сброс, очистка, удаление).
   Буферы, которые запустили функцией <span class="function"><a href="function.ob-start.php" class="function">ob_start()</a></span>, активируются
   с той строки, на которой вызвали функцию,
   тогда как те, которые запустили
   директивой <a href="outcontrol.configuration.php#ini.output-buffering" class="link">output_buffering</a>,
   буферизуют вывод начиная с первой строки скрипта.
  </p>
  <p class="para">
   PHP также поставляется со встроенным обработчиком вывода <code class="literal">URL-Rewriter</code>,
   который запускает свой буфер вывода и разрешает
   запускать одновременно до двух его экземпляров
   (один для перезаписи URL-адресов на уровне пользователя
   и ещё один для поддержки прозрачного идентификатора сессии).
   Эти буферы запускают вызовом функции
   <span class="function"><a href="function.output-add-rewrite-var.php" class="function">output_add_rewrite_var()</a></span>
   и (или) включением
   директивы <a href="session.configuration.php#ini.session.use-trans-sid" class="link">session.use_trans_sid</a>
   в файле <var class="filename">php.ini</var>.
  </p>
  <p class="para">
   В модуль <code class="literal">zlib</code>, который входит в комплект PHP, интегрировали свой
   буфер вывода, который включают директивой
   <a href="zlib.configuration.php#ini.zlib.output-compression" class="link">zlib.output_compression</a>
   в файле <var class="filename">php.ini</var>.
  </p>
  <blockquote class="note"><p><strong class="note">Замечание</strong>: 
   <span class="simpara">
    Хотя обработчик <code class="literal">URL-Rewriter</code> и выделяется тем,
    что разрешает запускать одновременно только до двух своих экземпляров,
    пользовательские буферы вывода работают с теми же базовыми буферами,
    которые использует функция <span class="function"><a href="function.ob-start.php" class="function">ob_start()</a></span>,
    а их функциональность реализуется пользовательской функцией обработчика вывода.
    Поэтому их функциональность в состоянии сымитировать пользовательский код.
   </span>
  </p></blockquote>
 </div>

 

 

 

 <div class="section">
  <h2 class="title">Сброс, доступ и очистка содержимого буфера</h2>
  <p class="para">
   Сброс отправляет и удаляет содержимое активного буфера.
   Буферы вывода сбрасываются, когда размер вывода
   превышает размер буфера, скрипт завершает работу
   или вызываются функции <span class="function"><a href="function.ob-flush.php" class="function">ob_flush()</a></span>, <span class="function"><a href="function.ob-end-flush.php" class="function">ob_end_flush()</a></span>
   или <span class="function"><a href="function.ob-get-flush.php" class="function">ob_get_flush()</a></span>.
  </p>
  <div class="caution"><strong class="caution">Предостережение</strong>
   <p class="simpara">
    Вызов функций <span class="function"><a href="function.ob-end-flush.php" class="function">ob_end_flush()</a></span>
    или <span class="function"><a href="function.ob-get-flush.php" class="function">ob_get_flush()</a></span> отключит активный буфер.
   </p>
  </div>
  <div class="caution"><strong class="caution">Предостережение</strong>
   <p class="simpara">
    Сброс буферов также сбросит возвращаемое обработчиком вывода значение,
    которое обработчик вывода умеет изменять,
    и если так, значение будет отличаться от содержимого буфера.
    Например, передача в обработчик вывода функции <span class="function"><a href="function.ob-gzhandler.php" class="function">ob_gzhandler()</a></span> приведёт
    к сжатию данных вывода и сбросу сжатого вывода.
   </p>
  </div>
  <p class="para">
   Содержимое активного буфера получают вызовом
   функций <span class="function"><a href="function.ob-get-contents.php" class="function">ob_get_contents()</a></span>, <span class="function"><a href="function.ob-get-clean.php" class="function">ob_get_clean()</a></span>
   или <span class="function"><a href="function.ob-get-flush.php" class="function">ob_get_flush()</a></span>.
  </p>
  <p class="para">
   Если нужен только размер содержимого буфера,
   функции <span class="function"><a href="function.ob-get-length.php" class="function">ob_get_length()</a></span> или <span class="function"><a href="function.ob-get-status.php" class="function">ob_get_status()</a></span>
   вернут размер содержимого в байтах.
  </p>
  <div class="caution"><strong class="caution">Предостережение</strong>
   <p class="simpara">
    Вызов функций <span class="function"><a href="function.ob-get-clean.php" class="function">ob_get_clean()</a></span>
    или <span class="function"><a href="function.ob-get-flush.php" class="function">ob_get_flush()</a></span> отключит активный буфер
    после возврата его содержимого.
   </p>
  </div>
  <p class="para">
   Содержимое активного буфера очищают вызовом функций
   <span class="function"><a href="function.ob-clean.php" class="function">ob_clean()</a></span>, <span class="function"><a href="function.ob-end-clean.php" class="function">ob_end_clean()</a></span>
   или <span class="function"><a href="function.ob-get-clean.php" class="function">ob_get_clean()</a></span>.
  </p>
  <div class="caution"><strong class="caution">Предостережение</strong>
   <p class="simpara">
    Вызов функций <span class="function"><a href="function.ob-end-clean.php" class="function">ob_end_clean()</a></span>
    или <span class="function"><a href="function.ob-get-clean.php" class="function">ob_get_clean()</a></span> отключит активный буфер вывода.
   </p>
  </div>
 </div>

 <div class="section">
  <h2 class="title">Отключение буферов</h2>
  <p class="para">
   Буферы вывода отключают вызовом функций
   <span class="function"><a href="function.ob-end-clean.php" class="function">ob_end_clean()</a></span>, <span class="function"><a href="function.ob-end-flush.php" class="function">ob_end_flush()</a></span>,
   <span class="function"><a href="function.ob-get-flush.php" class="function">ob_get_flush()</a></span> или <span class="function"><a href="function.ob-get-clean.php" class="function">ob_get_clean()</a></span>.
  </p>
  <div class="warning"><strong class="warning">Внимание</strong>
   <p class="simpara">
    Буферы вывода, которые запустили без флага
    <strong><code><a href="outcontrol.constants.php#constant.php-output-handler-removable">PHP_OUTPUT_HANDLER_REMOVABLE</a></code></strong>,
    нельзя отключить, а попытка удалить такие буферы выдаст ошибку уровня <strong><code><a href="errorfunc.constants.php#constant.e-notice">E_NOTICE</a></code></strong>.
   </p>
  </div>
  <p class="para">
   Каждый буфер вывода, который не закрыли до конца скрипта
   или вызовом конструкции <span class="function"><a href="function.exit.php" class="function">exit()</a></span>, сбросит
   и отключит процесс завершения работы PHP.
   Буферы сбрасываются и отключаются
   в порядке, обратном их запуску.
   Буфер, который запустили последним, будет первым,
   а буфер, который запустили первым, сбросится и отключится в последнюю очередь.
  </p>
  <div class="caution"><strong class="caution">Предостережение</strong>
   <p class="simpara">
    Пользовательский обработчик вывода активируют,
    чтобы предотвратить сброс буфера вывода при завершении работы PHP,
    если сброс содержимого буферов не нужен.
   </p>
  </div>
 </div>

 

 

 

 

 <div class="section">
  <h2 class="title">Исключения в обработчиках вывода</h2>
  <p class="para">
   Если в обработчике вывода выбрасывается неперехваченное исключение,
   программа завершается, а процесс завершения работы вызывает обработчик,
   затем выводится сообщение об ошибке <code class="literal">Uncaught Exception</code>.
  </p>
  <p class="para">
   Если в обработчике вывода, который вызвали функцией <span class="function"><a href="function.ob-flush.php" class="function">ob_flush()</a></span>,
   <span class="function"><a href="function.ob-end-flush.php" class="function">ob_end_flush()</a></span> или <span class="function"><a href="function.ob-get-flush.php" class="function">ob_get_flush()</a></span>,
   выбрасывается неперехваченное исключение,
   содержимое буфера сбрасывается перед сообщением об ошибке.
  </p>
  <p class="para">
   Если в обработчике вывода неперехваченное исключение выбрасывается при выключении,
   обработчик завершается, ни содержимое буфера,
   ни сообщение об ошибке не сбрасываются.
  </p>
  <blockquote class="note"><p><strong class="note">Замечание</strong>: 
   <span class="simpara">
    Если обработчик вывода выбрасывает исключение,
    PHP устанавливает для обработчика флаг состояния <strong><code><a href="outcontrol.constants.php#constant.php-output-handler-disabled">PHP_OUTPUT_HANDLER_DISABLED</a></code></strong>.
   </span>
  </p></blockquote>
 </div>

 <div class="section">
  <h2 class="title">Ошибки в обработчиках вывода</h2>
  <p class="para">
   Если в обработчике вывода выдаётся неустранимая ошибка,
   программа продолжает выполняться.
  </p>
  <p class="para">
   Если в обработчике, который вызвали функцией
   <span class="function"><a href="function.ob-flush.php" class="function">ob_flush()</a></span>, <span class="function"><a href="function.ob-end-flush.php" class="function">ob_end_flush()</a></span>
   или <span class="function"><a href="function.ob-get-flush.php" class="function">ob_get_flush()</a></span>,
   возникает неустранимая ошибка,
   буфер сбрасывает данные, которые вернул обработчик.
   Если обработчик возвращает значение <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>, сбрасываются буфер и сообщение об ошибке.
   Если возвращает другое значение, возвращаемое обработчиком значение сбрасывается,
   но не сообщение об ошибке.
  </p>
  <blockquote class="note"><p><strong class="note">Замечание</strong>: 
   <span class="simpara">
    Если обработчик возвращает значение <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>
    PHP устанавливает для обработчика флаг состояния <strong><code><a href="outcontrol.constants.php#constant.php-output-handler-disabled">PHP_OUTPUT_HANDLER_DISABLED</a></code></strong>.
   </span>
  </p></blockquote>
  <p class="para">
   Если в обработчике вывода возникает фатальная ошибка,
   программа завершается, а процесс завершения работы вызывает обработчик,
   затем сбрасывается сообщение об ошибке.
  </p>
  <p class="para">
   Если в обработчике вывода, который вызвали функцией <span class="function"><a href="function.ob-flush.php" class="function">ob_flush()</a></span>,
   <span class="function"><a href="function.ob-end-flush.php" class="function">ob_end_flush()</a></span> или <span class="function"><a href="function.ob-get-flush.php" class="function">ob_get_flush()</a></span>,
   возникает фатальная ошибка,
   содержимое буферов сбрасывается перед сообщением об ошибке.
  </p>
  <p class="para">
   Если в обработчике вывода фатальная ошибка возникает при выключении,
   программа завершается без сброса буфера или сообщения об ошибке.
  </p>
 </div>

 <div class="section">
  <h2 class="title">Вывод обработчиков вывода</h2>
  <p class="para">
   При конкретных обстоятельствах выходные данные, которые создаются в обработчике,
   сбрасываются вместе с содержимым буфера. Этот вывод не добавляется
   в буфер и не становится строкой,
   которую возвращает функция <span class="function"><a href="function.ob-get-flush.php" class="function">ob_get_flush()</a></span>.
  </p>
  <p class="para">
   Если во время операций сброса (при вызове функций <span class="function"><a href="function.ob-flush.php" class="function">ob_flush()</a></span>,
   <span class="function"><a href="function.ob-end-flush.php" class="function">ob_end_flush()</a></span>, <span class="function"><a href="function.ob-get-flush.php" class="function">ob_get_flush()</a></span>
   и при завершении работы)
   возвращаемое значение обработчика равно <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>,
   содержимое буфера сбрасывается, а затем идёт вывод.
   Если обработчик не вызывается при завершении работы,
   то обработчик выбрасывает исключение;
   вызов конструкции <span class="function"><a href="function.exit.php" class="function">exit()</a></span>
   ведёт себя так же.
  </p>
  <blockquote class="note"><p><strong class="note">Замечание</strong>: 
   <span class="simpara">
    Если обработчик возвращает значение <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>,
    PHP устанавливает для обработчика флаг состояния <strong><code><a href="outcontrol.constants.php#constant.php-output-handler-disabled">PHP_OUTPUT_HANDLER_DISABLED</a></code></strong>.
   </span>
  </p></blockquote>
 </div>

 <div class="section">
  <h2 class="title">Флаги состояния обработчика вывода</h2>
  <p class="para">
   PHP устанавливает <a href="outcontrol.constants.php#outcontrol.constants.flags-returned-by-handler" class="link">
    флаги состояния обработчика
   </a> битовой маски флагов (<code class="literal">flags</code>) буфера
   каждый раз при вызове обработчика вывода
   и делает их частью флагов (<code class="literal">flags</code>), которые возвращает
   функция <span class="function"><a href="function.ob-get-status.php" class="function">ob_get_status()</a></span>.
   Если обработчик успешно выполняется и не возвращает значение <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>,
   PHP устанавливает флаги состояния <strong><code><a href="outcontrol.constants.php#constant.php-output-handler-started">PHP_OUTPUT_HANDLER_STARTED</a></code></strong>
   и <strong><code><a href="outcontrol.constants.php#constant.php-output-handler-processed">PHP_OUTPUT_HANDLER_PROCESSED</a></code></strong>.
   Если обработчик возвращает значение <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> или выбрасывает исключение во время работы,
   PHP устанавливает флаги состояния <strong><code><a href="outcontrol.constants.php#constant.php-output-handler-started">PHP_OUTPUT_HANDLER_STARTED</a></code></strong>
   и <strong><code><a href="outcontrol.constants.php#constant.php-output-handler-disabled">PHP_OUTPUT_HANDLER_DISABLED</a></code></strong>.
  </p>
  <blockquote class="note"><p><strong class="note">Замечание</strong>: 
   <span class="simpara">
    Обработчик не будет запускаться при вызове функций
    <span class="function"><a href="function.ob-end-clean.php" class="function">ob_end_clean()</a></span>, <span class="function"><a href="function.ob-end-flush.php" class="function">ob_end_flush()</a></span>,
    <span class="function"><a href="function.ob-get-clean.php" class="function">ob_get_clean()</a></span>, <span class="function"><a href="function.ob-get-flush.php" class="function">ob_get_flush()</a></span>,
    <span class="function"><a href="function.ob-clean.php" class="function">ob_clean()</a></span>, <span class="function"><a href="function.ob-flush.php" class="function">ob_flush()</a></span>
    или при завершении процесса работы PHP,
    если для обработчика установили значение <strong><code><a href="outcontrol.constants.php#constant.php-output-handler-disabled">PHP_OUTPUT_HANDLER_DISABLED</a></code></strong>.
    До PHP 8.4.0 этот флаг не влиял на вызов функций <span class="function"><a href="function.ob-clean.php" class="function">ob_clean()</a></span>
    и <span class="function"><a href="function.ob-flush.php" class="function">ob_flush()</a></span>.
   </span>
  </p></blockquote>
 </div>

</div>
<?php manual_footer($setup); ?>