1. このページの目的
PHP: ob_start - Manual のサンプルコード(2003年に書かれたコード!!)を試す。
2. サンプルコード
元のコードを一部変更している。
echo 'Z';
ob_start(); // start output buffer 1
echo "a"; // fill ob1
ob_start(); // start output buffer 2
echo "b"; // fill ob2
$s1 = ob_get_contents(); // read ob2 ("b")
ob_end_flush(); // flush ob2 to ob1
echo "c"; // continue filling ob1
$s2 = ob_get_contents(); // read ob1 ("a" . "b" . "c")
ob_end_flush(); // flush ob1 to browser
// echoes "b" followed by "abc", as supposed to:
echo "<br>----------------<br>";
echo "\$s2 = '$s2'<br>";
echo "\$s1 = '$s1'";
echo "<br>----------------<br>";
3. 実験
上記のコードを以下で実行する。
Zabc
----------------
$s2 = 'b'
$s1 = 'abc'
----------------
4. 結果
- 1つ目のバッファは最初にバッファリングを開始したので、 'abc' すべて保持している。
echo "a"
で出力された 'a'- バッファ2が保持してから返却した 'b'
- 2回目の
ob_start()
がコールバック関数を持っていたら、'b' がコールバック関数によってフィルタリングされた結果が返却される
- 2回目の
echo "c"
で出力された 'c'- その結果、'a' + 'b' + 'c' => 'abc' を保持する。
- 2つ目のバッファは 'b' しか保持していない。
5. 動作の説明
ob_start(callback1)
を実行すると、この時点からの出力がバッファ1に送られるようになる- ここで出力があると、バッファ1 に送られる
ob_start(callback2)
を実行すると、この時点からの出力がバッファ2 に送られるようになる- ここで出力があると、バッファ2 に送られる(バッファ1には送られない)。
ob_end_flush()
を実行すると、バッファ2 の内容がcallback2()
でフィルタされた結果が、バッファ1に送られる- ここで出力があると、バッファ1 に送られる
ob_end_flush()
を実行すると、バッファ1 の内容がcallback1()
でフィルタされた結果が、画面に送られる
* ob_start()によるバッファはスタック構造になっている。