<?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 => 'ja',
  ),
  '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' => 'ja',
    '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> や
  <var class="filename">php.ini</var> 設定 <a href="outcontrol.configuration.php#ini.implicit-flush" class="link">implicit_flush</a>
  経由で暗黙のフラッシュを有効にする方法です。
 </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 は出力を生成するコードブロックが終了するたびに、
   フラッシュを実行しようとします。
   このコンテクストにおける出力は、以下に示す長さが 0 より大きなデータです:
   <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">&quot;\n&quot;</code>, <code class="literal">&quot;\r&quot;</code>,
    <code class="literal">&quot;\0&quot;</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> をコールしたり、
    暗黙のフラッシュを有効にすると、
    Web のコンテキスト中でヘッダを設定して送信するユーザレベルの出力バッファのハンドラ(例: <span class="function"><a href="function.ob-gzhandler.php" class="function">ob_gzhandler()</a></span>) を邪魔する可能性があります。
    これは、これらのハンドラがヘッダを送信する前に、フラッシュの動作がヘッダを送信することが原因です。
   </p>
  </div>
  <p class="para">
   基礎となる ソフトウェア/ハードウェアによって実装されたバッファリングは
   PHP によって上書きできません。
   よって、PHP のバッファ制御関数を使う際にはこの点を考慮する必要があります。
   ウェブサーバー/ブラウザ/コンソールのバッファリング設定をチェックして使うことで、
   起こりうる問題を軽減することができます。
   Web のコンテキストで作業する場合、ウェブサーバーのバッファリング設定や
   スクリプトのバッファリングを一緒に調整することができます。
   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>
   ごとに少し違ったやり方で実装されていますが、
   以下の2つのカテゴリに分類できます:
   <ul class="itemizedlist">
    <li class="listitem">
     <span class="simpara">
      Web のコンテキストで使われる <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>
      がこうした <abbr title="Server Application Programming Interface">SAPI</abbr> に該当します。
     </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); ?>