<?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.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' => 'ja',
    '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">
   出力バッファリングは、<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> の方がより柔軟です。
   なぜなら、出力ハンドラをユーザー定義関数として受け入れますし、
   (フラッシュ、クリーン、削除 のような)
   バッファに対する操作もできるからです。
   <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">&quot;URL-Rewriter&quot;</code>
   出力ハンドラをバンドルしています。
   このハンドラは、自分の出力バッファを開始します。
   同時に実行できるのはふたつです(1つはユーザレベルのURL書き換えと、
   透過的なセッションIDサポートのためのもの) 。
   これらのバッファは、<span class="function"><a href="function.output-add-rewrite-var.php" class="function">output_add_rewrite_var()</a></span>
   関数をコールするか、<var class="filename">php.ini</var> 設定
   <a href="session.configuration.php#ini.session.use-trans-sid" class="link">session.use_trans_sid</a>
   を有効にすることで開始できます。
  </p>
  <p class="para">
   バンドルされている <code class="literal">zlib</code> 拡張モジュールは、
   独自の出力バッファを持っています。
   この出力バッファは、<var class="filename">php.ini</var> 設定
   <a href="zlib.configuration.php#ini.zlib.output-compression" class="link">zlib.output_compression</a>
   を使うことで有効にできます。
  </p>
  <blockquote class="note"><p><strong class="note">注意</strong>: 
   <span class="simpara">
    一度に二つまでしか実行できないという意味で、
    <code class="literal">&quot;URL-Rewriter&quot;</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">
    バッファの内容をフラッシュしたくない場合は、
    カスタムの出力ハンドラを使い、シャットダウン中のフラッシュを防ぐべきです。
   </p>
  </div>
 </div>

 

 

 

 

 <div class="section">
  <h2 class="title">出力ハンドラでスローされる例外</h2>
  <p class="para">
   捕捉されない例外が出力ハンドラでスローされた場合、
   プログラムは終了し、<code class="literal">&quot;Uncaught Exception&quot;</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">
    ハンドラが例外をスローした場合、
    <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> を返す場合、
    <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> を返した場合、
    <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">
   バッファが持つ <code class="literal">flags</code> ビットマスクの
   <a href="outcontrol.constants.php#outcontrol.constants.flags-returned-by-handler" class="link">出力ハンドラのステータスフラグ</a> は、
   出力ハンドラが起動されるたびに設定され、
   <span class="function"><a href="function.ob-get-status.php" class="function">ob_get_status()</a></span> が返す <code class="literal">flags</code>
   の一部になります。
   ハンドラが正常に実行され、<strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> を返さなかった場合、
   <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> を返すか、実行中に例外がスローされた場合は、
   <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">
    ハンドラの <strong><code><a href="outcontrol.constants.php#constant.php-output-handler-disabled">PHP_OUTPUT_HANDLER_DISABLED</a></code></strong>
    が設定されている場合、
    <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 のシャットダウン処理中でも同様です。
    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); ?>