出力バッファ「ob_start()」

ob_startはphpからの出力を一時的に記憶するバッファという機能を持つ関数です。引数はオプションで省略可能です。オプションを指定する場合、第一引数には出力内容を処理するコールバック関数を登録します。第二引数には分割するサイズを指定しますが、設定しない場合は出力された全てが一時的に記憶されます。第三引数にはob系関数へのアクセスをコントロールするフラグを指定しますが、デフォルトがPHP_OUTPUT_HANDLER_STDFLAGSになっています。

このPHP_OUTPUT_HANDLER_STDFLAGSは、
PHP_OUTPUT_HANDLER_CLEANABLE(ob_clean()、ob_end_clean()、ob_get_clean())|
PHP_OUTPUT_HANDLER_FLUSHABLE(ob_end_flush()、ob_flush()、ob_get_flush())|
PHP_OUTPUT_HANDLER_REMOVABLE(ob_end_clean()、ob_end_flush()、ob_get_flush())|
を短縮するもので、デフォルトで全ての制御ができます。

この関数であらかじめバッファしておくと、好きな場所でheader関数などが使えます。また、includeやrequireなどで呼び出したファイルそのものをバッファして変数に格納することで、好きな場所で複数回に渡る処理をすることができます。

ob_start()でバッファを取得

ob_get_contents()は、現在出力されているバッファを取得し、ob_get_clean()は取得と共にバッファを破棄します。ob_get_contents()を使う場合、ob_end_clean()かob_clean()で終了させます。ob_end_clean()は現在出力されているバッファ内容と共にバッファそのものも破棄します。ob_clean()は現在出力されているバッファ内容を削除しますが、バッファそのものは破棄しません。

PHP
1
2
3
4
5
6
7
<?php
ob_start();
echo 'testA';
$buffer = ob_get_contents();
ob_end_clean();
echo $buffer;
?>
実行結果:testA
PHP
1
2
3
4
5
6
<?php
ob_start();
echo 'testB';
$buffer = ob_get_clean();
echo $buffer;
?>
実行結果:testB
PHP
1
2
3
4
5
6
7
8
9
<?php
ob_start();
echo 'test1';
ob_start();
echo 'test2';
ob_end_clean();
$buffer = ob_get_clean();
echo $buffer;
?>
実行結果:test1

ob_end_flush()とob_flush()

ob_end_flush()は現在出力されているバッファ内容を次の出力バッファに送って、バッファを破棄します。
ob_flush()は現在出力されているバッファ内容を次の出力バッファに送りますが、バッファは破棄しません。

PHP
1
2
3
4
5
6
7
8
<?php
ob_start();
echo 'test1';
ob_start();
echo 'test2';
ob_end_clean();
ob_end_flush();
?>
実行結果:test1

出力バッファ状態を取得

「ob_get_status()」「ob_get_level()」「ob_get_length()」の各関数を使います。ob_get_status()は、現在設定されているすべての出力バッファ状態を配列として返します。引数は省略すできますが、trueを指定すると更に詳細な情報が得られます。ob_get_level()は、出力バッファの入れ子レベル数を返します。ob_get_length()はバイト単位でバッファ内に含まれるデータ量を返します。