2007-04-26
■[PHP]出力バッファとflush()・ob_flush()
しばらく使わないとすっかり忘れてしまうので、まとめてメモ。
ありがちなネタとして、
- プログレスバー(進捗状況をリアルタイムに表示)
- 「お待ちください」と表示させて裏で処理を実行し、処理が終わったら結果を表示する
などがありますが、これらを行うには出力データのバッファリング/フラッシュを行うことになります。
で、PHP的にはob_*関数やflush関数を使うことになりますが、 [PHP-users 18135]プログレスバーは実現可能か? のスレッドから
- flush()が動作する条件は、出力バッファが無いこと
- ob_flush()が動作する条件は、出力バッファのネストレベルが1であること
- 出力バッファのネストレベルはob_get_level()で取得できる
- output_handler、output_buffer(> 0)を指定すると、ネストレベルが変わります
という注意点が挙げられます。
たとえば、 [PHP-users 18141]Re: プログレスバーは実現可能か? にあるコードを元にした以下のようなコード
<?php echo 'ob_get_level()=' . ob_get_level() . '<br>'; ob_end_flush(); echo 'ob_get_level()=' . ob_get_level() . '<br>'; ob_start(); echo 'ob_get_level()=' . ob_get_level() . '<br>'; for ( $i = 1; $i <= 100000; $i++ ) { if ($i % 100 == 0) { //DATA_UNIT=100 echo "■"; if (($i % 1000 == 0)) { echo "|"; } if ($i % 5000 == 0) { echo "<br>"; usleep(200000); } ob_flush(); flush(); } } echo 'finish';
の場合、output_handler=none、output_buffer > 0の場合や、mbstring.http_outputが適切に設定されている場合の出力結果は
ob_get_level()=1 ob_get_level()=0 ob_get_level()=1 ...
となり、ネストレベルが1なので、期待通りバッファリング/フラッシュされます。
ただし、mbstring.internal_encoding(mbstring.script_encodingを指定している場合はこれ)とmbstring.http_outputが異なる場合、ネストレベルが一度0になってしまうと文字化けを起こす場合があります。この場合は、
<?php //ob_end_flush(); //ob_start();
とするか
<?php ob_end_flush(); ob_start('mb_output_handler');
とすればOKです。
まあ、いずれにしても「出力バッファのネストレベルを1にする」と覚えておけばヨサゲです。
トラックバック - http://d.hatena.ne.jp/shimooka/20070426/1177571621
リンク元
- 530 http://d.hatena.ne.jp/railtown/20081202/1228186838
- 511 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rls=GGLJ,GGLJ:2006-36,GGLJ:ja&q=go+pear
- 418 http://www.google.co.jp/search?q=php+flush&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox
- 273 http://wakaba-memo.cocolog-nifty.com/blog/2008/09/php-ce8b.html
- 272 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:ja:official&hs=AAI&q=バッファ+PHP&btnG=検索&lr=lang_ja
- 269 http://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=PEAR+Twitter&num=50
- 224 http://www.google.co.jp/search?q=PHP+バッファリング&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox-a
- 181 http://www.google.co.jp/search?q=php+flush&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:unofficial&client=firefox
- 141 http://www.google.co.jp/search?hl=ja&q=php+????????????&lr=
- 141 http://www.google.co.jp/search?q=ob_flush&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox








