PHP: ob_start() によるバッファのスタック構造を検証する

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. 結果

5. 動作の説明

  1. ob_start(callback1)を実行すると、この時点からの出力がバッファ1に送られるようになる
  2. ここで出力があると、バッファ1 に送られる
  3. ob_start(callback2)を実行すると、この時点からの出力がバッファ2 に送られるようになる
  4. ここで出力があると、バッファ2 に送られる(バッファ1には送られない)。
  5. ob_end_flush()を実行すると、バッファ2 の内容がcallback2()でフィルタされた結果が、バッファ1に送られる
  6. ここで出力があると、バッファ1 に送られる
  7. ob_end_flush()を実行すると、バッファ1 の内容がcallback1()でフィルタされた結果が、画面に送られる

* ob_start()によるバッファはスタック構造になっている。

ob_start によるバッファの動作