出力バッファリング
出力バッファリングとは、ブラウザ(Web の場合) や シェル(コマンドラインの場合) に出力をフラッシュ(送信して破棄)する前に、 バッファリング(一時的に保存) することです。 出力バッファリングが有効な間は、スクリプトから出力は送信されず、 代わりに内部バッファに保存されます。
PHPに影響するバッファリング
PHP は、出力をフラッシュする際に、 基礎となる ソフトウェア/ハードウェア のインフラストラクチャに依存します。 コマンドライン上のコンソールで実装されているバッファリング (例: 行バッファリング(訳注: 改行されるごとにフラッシュされる)) や Web のコンテキストにおける ウェブサーバー やブラウザが実装するバッファリング (例: フルバッファリング(訳注:バッファが一杯になったらフラッシュされる)) は、 エンドユーザーに出力を表示するタイミングに影響を与えます。 サーバーの設定を微調整したり、 さまざまなレイヤーのバッファサイズを揃えたりすることで、これらの影響のいくつかを取り除くことができます。
PHPにおける出力バッファリングの制御
PHP は、ユーザレベルの出力バッファを提供しており、 バッファリングを開始したり、管理したり、無効にしたりする関数を提供しています。 (これらの関数のほとんどは、ob_* 関数にあります) そして、既存のシステムバッファをフラッシュするための関数をふたつ (flush()と ob_implicit_flush()) 提供しています。 これらの機能の中には、php.ini を適切に設定することで、 設定や構成できるものがあります。
バッファリングの用途
出力バッファリングは一般的に、 バッファリングされた出力を修正したり、検査したり、 リクエストの中で出力を複数回使う場合に有用です。 あるいは、出力をフラッシュするタイミングを制御したい場合にも有用です。 具体的な使用例として、以下が挙げられます:
-
計算/時間のかかるスクリプトの実行結果をキャッシュする場合。
たとえば、静的な
HTML
ページを生成する場合などです。 - 生成された出力を表示したり、ファイルに保存したり、 電子メールで送るなどの用途に再利用することができます。
-
HTML
ページのhead
をbody
とは別にフラッシュすることで、 ブラウザは時間のかかる可能性のある処理 (例: データベース/ファイルへのアクセス、外部ネットワーク接続) をスクリプトが実行している間に、外部リソースを読み込むことができます。 これは、HTTP
ステータスコード がヘッダ送信後に変更できない場合にのみ有効です。 - 出力を生成する関数(例: phpinfo())から情報を抽出する場合。
-
出力を部分的に修正したり、一部を採用したり
(例えば、データの抽出、単語/フレーズの置換、
足りない
HTML
タグの追加)、 特定の条件下(例えばエラー)では完全に破棄することで、 サードパーティのコードの出力を制御します。 - 特定のウェブサーバーでは利用できない機能をサポートする場合。 (出力の圧縮やエンコードなど)