<?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.flushing-system-buffers.php',
    1 => 'Сброс (отправка) системных буферов',
    2 => 'Сброс (отправка) системных буферов',
  ),
  'up' => 
  array (
    0 => 'book.outcontrol.php',
    1 => 'Контроль вывода',
  ),
  'prev' => 
  array (
    0 => 'outcontrol.output-buffering.php',
    1 => 'Буферизация вывода',
  ),
  'next' => 
  array (
    0 => 'outcontrol.user-level-output-buffers.php',
    1 => 'Пользовательские буферы вывода',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ru',
    'path' => 'reference/outcontrol/flushing-system-buffers.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="outcontrol.flushing-system-buffers" class="chapter">
 <h1 class="title">Сброс (отправка) системных буферов</h1>

 <p class="para">
  PHP предлагает два взаимосвязанных способа
  сброса (отправки и удаления содержимого) системных буферов:
  один — вызов функции <span class="function"><a href="function.flush.php" class="function">flush()</a></span>,
  другой — включение неявного сброса
  функцией <span class="function"><a href="function.ob-implicit-flush.php" class="function">ob_implicit_flush()</a></span>
  или директивой <a href="outcontrol.configuration.php#ini.implicit-flush" class="link">implicit_flush</a>
  в файле <var class="filename">php.ini</var>.
 </p>

 <div class="section">
  <h2 class="title">Поведение сброса (отправки) вывода</h2>
  <p class="para">
   Когда неявный сброс выключен, PHP будет сбрасывать вывод, только
   когда вызвана функция <span class="function"><a href="function.flush.php" class="function">flush()</a></span> или когда скрипт завершил работу.
  </p>
  <p class="para">
   При включённом неявном сбросе PHP попытается сбросить вывод
   после каждого блока кода, который выводит данные.
   Вывод в этом контексте — данные ненулевой длины, которые:
   <ul class="itemizedlist">
    <li class="listitem">
     <span class="simpara">
      написали за пределами тегов <code class="literal">&lt;?php ?&gt;</code>
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      выводятся языковыми конструкциями и функциями, явная цель которых заключается
      в выводе пользовательских переменных или строк, наподобие:
      <span class="function"><a href="function.echo.php" class="function">echo</a></span>, <span class="function"><a href="function.print.php" class="function">print</a></span>,
      <span class="function"><a href="function.printf.php" class="function">printf()</a></span>, <span class="function"><a href="function.var-dump.php" class="function">var_dump()</a></span>,
      <span class="function"><a href="function.var-export.php" class="function">var_export()</a></span>, <span class="function"><a href="function.vprintf.php" class="function">vprintf()</a></span>
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      выводятся функциями, цель которых состоит в сборе и выводе
      данных или информации о запущенном скрипте или PHP, наподобие:
      <span class="function"><a href="function.debug-print-backtrace.php" class="function">debug_print_backtrace()</a></span>, <span class="function"><a href="function.phpcredits.php" class="function">phpcredits()</a></span>,
      <span class="function"><a href="function.phpinfo.php" class="function">phpinfo()</a></span>,
      <span class="methodname"><a href="reflectionextension.info.php" class="methodname">ReflectionExtension::info()</a></span>
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      выводит PHP при неперехваченном исключении или необработанной ошибке
      (при условии, что включены директивы
      <a href="errorfunc.configuration.php#ini.display-errors" class="link">display_errors</a>
      и <a href="errorfunc.configuration.php#ini.error-reporting" class="link">error_reporting</a>)
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      записывают в поток <code class="literal">php://output</code>
     </span>
    </li>
   </ul>
  </p>
  <blockquote class="note"><p><strong class="note">Замечание</strong>: 
   <span class="simpara">
    Печать пустых строк или отправка заголовков не рассматривается как вывод
    и не приведёт к операции сброса.
   </span>
  </p></blockquote>
  <div class="warning"><strong class="warning">Внимание</strong>
   <p class="simpara">
    Если неявный сброс включён, управляющие символы
    (например, <code class="literal">«\n»</code>, <code class="literal">«\r»</code>,
    <code class="literal">«\0»</code>)
    также вызовут сброс.
   </p>
  </div>
 </div>

 <div class="section">
  <h2 class="title">Ограничения</h2>
  <p class="para">
   Функции сброса системных буферов не сбрасывают пользовательские буферы вывода.
   Чтобы использовать системный и пользовательский буферы вместе,
   пользовательские буферы вывода сбрасывают
   перед сбросом системных буферов, чтобы PHP вывел данные.
  </p>
  <div class="warning"><strong class="warning">Внимание</strong>
   <p class="simpara">
    Не исключён риск того, что вызов функции <span class="function"><a href="function.flush.php" class="function">flush()</a></span> или включённый неявный сброс
    помешает обработчикам пользовательских буферов вывода,
    устанавливающим и отправляющим заголовки в веб-контексте
    (например, функция <span class="function"><a href="function.ob-gzhandler.php" class="function">ob_gzhandler()</a></span>),
    отправив заголовки до того, как их отправят обработчики.
   </p>
  </div>
  <p class="para">
   При работе с функциями управления PHP-буфером учитывают,
   что PHP не умеет переопределять буферизацию,
   реализованную базовыми программными или аппаратными средствами.
   Проверка настроек буферизации веб-серверов, браузеров, консолей
   и работа с ними помогают устранить возникающие проблемы.
   При работе в веб-контексте для совместной согласованной работы
   регулируют настройки буферизации веб-сервера
   или буферизации скрипта,
   тогда как обойти стратегии буферизации веб-браузеров
   можно, настроив буферизацию в PHP-скрипте.
   На консолях, которые реализуют буферизацию строк,
   символы новой строки вставляют в нужные места
   перед сбросом вывода.
  </p>
 </div>

 <div class="section">
  <h2 class="title">Различия в сбросе в интерфейсах <abbr title="Server Application Programming Interface">SAPI</abbr></h2>
  <p class="para">
   Хотя реализации сброса в каждом интерфейсе <abbr title="Server Application Programming Interface">SAPI</abbr> слегка различаются,
   эти реализации попадают в одну из категорий:
   <ul class="itemizedlist">
    <li class="listitem">
     <span class="simpara">
      Интерфейсы <abbr title="Server Application Programming Interface">SAPI</abbr> в веб-контексте вначале сбросят заголовки,
      а затем вывод.
      К таким <abbr title="Server Application Programming Interface">SAPI</abbr> относятся <code class="literal">Apache2Handler</code>, <code class="literal">CGI</code>,
      <code class="literal">FastCGI</code> и <code class="literal">FPM</code>
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      другие <abbr title="Server Application Programming Interface">SAPI</abbr>, например
      <code class="literal">CLI</code> и <code class="literal">embed</code>,
      только сбросят вывод
     </span>
    </li>
   </ul>
  </p>
 </div>

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