- ベストアンサー
ob_start()とob_flush()の違いについて
- ob_start()関数を使用すると、出力バッファリングが開始されます。
- ob_flush()関数を使用すると、出力バッファの内容がフラッシュ(出力)されます。
- ob_start()関数の後にob_flush()を実行しなくても、出力はされますが、ob_flush()を使わない場合はバッファがフラッシュされないため、出力結果の制御が難しくなります。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
たしかにマニュアルを見る限り、ob_start()からob_end_clean()もob_end_flush()も 指定しない場合はどうなるか書いてないようですね しかしバッファはスタッカブルな仕様ですから、ob_end_flush()のつけ忘れ も懸念されますので、スクリプトが閉じた時点でob_start()とob_end_??の 数が一致していない(=指定し忘れた)場合ob_end_flushするというのが 「たまたま」ルールになっているのではないでしょうか? バッファというのはそもそも出力を一時的に停止する措置ですから、 スクリプトが終了した時点で出力されるのはまっとうな処理に思えます。 ちなみに「?>で」出力されるのではなく、スクリプトの終了時に出力 されると考えるのが妥当でしょう。 <? print ob_start(); print "hoge"; ?>fuga としたときにob_start()の戻り値である1がhogeの前に表示されることからも 処理の妥当性が理解できると思います。 フラッシュ指示していないのにフラッシュしていないのではなく end処理が抜けているので、わざわざさいごにフラッシュしてくれている と考えるのが賢明です
その他の回答 (1)
- yambejp
- ベストアンサー率51% (3827/7415)
ob_end_clean()でバッファをクリアしてないので、 ためてたバッファがフラッシュされているという解釈でよいのでは?
お礼
yamabejpさん、どうもありがとうございます。 ob_start();で溜めたバッファは、 フラッシュ処理(例えば、ob_flush()等)をしなくても、 フラッシュされてしまうものなのでしょうか? 前述しましたが、例えば、 「?>」をきっかけに、バッファされているものは、 フラッシュされてしまうのでしょうか? >ob_end_clean()でバッファをクリアしてないので、 >ためてたバッファがフラッシュされているという解釈でよいのでは? 「クリアはしていないので、バッファ内容自体は残っている」 ということは分かっているのですが、 フラッシュ処理をしないのにフラッシュされることに疑問を感じております。 【2】では、フラッシュしているので、出力されるのは理解できますが、 【1】では、フラッシュをしていないのに、出力されているわけです。 この点について、更なるアドバイスを頂けると嬉しいです。 宜しくお願い致します。
お礼
補足をどうもありがとうございます。 >たしかにマニュアルを見る限り、ob_start()からob_end_clean()もob_end_flush()も指定しない場合はどうなるか書いてないようですね 仰る通りで、私もアレコレ調べてみたのですが、 マニュアル(英文の所では書かれているかもしれませんが)の日本語の部分を読む限りでは、 私が知りたいことについての記述はありませんでした。 >ちなみに「?>で」出力されるのではなく、スクリプトの終了時に出力 されると考えるのが妥当でしょう。 そうですね、色々と試した感じでは、yamabejpさんが仰る通りの仕様であるように思います。 >わざわざさいごにフラッシュしてくれていると考えるのが賢明です 暗黙の了解ということなんでしょうかね。 基礎的なことかもしれませんが、こういったことに関する記述もPHPマニュアルには書いてあって欲しいなと今回思いました。