# 出力バッファリング

出力バッファリングとは、ブラウザ(Web の場合) や シェル(コマンドラインの場合) に出力をフラッシュ(送信して破棄)する前に、 バッファリング(一時的に保存) することです。 出力バッファリングが有効な間は、スクリプトから出力は送信されず、 代わりに内部バッファに保存されます。

## PHPに影響するバッファリング

PHP は、出力をフラッシュする際に、 基礎となる ソフトウェア/ハードウェア のインフラストラクチャに依存します。 コマンドライン上のコンソールで実装されているバッファリング (例: 行バッファリング(訳注: 改行されるごとにフラッシュされる)) や Web のコンテキストにおける ウェブサーバー やブラウザが実装するバッファリング (例: フルバッファリング(訳注:バッファが一杯になったらフラッシュされる)) は、 エンドユーザーに出力を表示するタイミングに影響を与えます。 サーバーの設定を微調整したり、 さまざまなレイヤーのバッファサイズを揃えたりすることで、これらの影響のいくつかを取り除くことができます。

## PHPにおける出力バッファリングの制御

PHP は、ユーザレベルの出力バッファを提供しており、 バッファリングを開始したり、管理したり、無効にしたりする関数を提供しています。 (これらの関数のほとんどは、ob_* 関数にあります) そして、既存のシステムバッファをフラッシュするための関数をふたつ (flush()と ob_implicit_flush()) 提供しています。 これらの機能の中には、php.ini を適切に設定することで、 設定や構成できるものがあります。

## バッファリングの用途

出力バッファリングは一般的に、 バッファリングされた出力を修正したり、検査したり、 リクエストの中で出力を複数回使う場合に有用です。 あるいは、出力をフラッシュするタイミングを制御したい場合にも有用です。 具体的な使用例として、以下が挙げられます:

- 計算/時間のかかるスクリプトの実行結果をキャッシュする場合。 たとえば、静的な`HTML`ページを生成する場合などです。
- 生成された出力を表示したり、ファイルに保存したり、 電子メールで送るなどの用途に再利用することができます。
- `HTML`ページの `head` を `body` とは別にフラッシュすることで、 ブラウザは時間のかかる可能性のある処理 (例: データベース/ファイルへのアクセス、外部ネットワーク接続) をスクリプトが実行している間に、外部リソースを読み込むことができます。 これは、`HTTP` ステータスコード がヘッダ送信後に変更できない場合にのみ有効です。
- 出力を生成する関数(例: phpinfo())から情報を抽出する場合。
- 出力を部分的に修正したり、一部を採用したり (例えば、データの抽出、単語/フレーズの置換、 足りない`HTML`タグの追加)、 特定の条件下(例えばエラー)では完全に破棄することで、 サードパーティのコードの出力を制御します。
- 特定のウェブサーバーでは利用できない機能をサポートする場合。 (出力の圧縮やエンコードなど)

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