ob_start()とob_flush()の違いについて

このQ&Aのポイント
  • ob_start()関数を使用すると、出力バッファリングが開始されます。
  • ob_flush()関数を使用すると、出力バッファの内容がフラッシュ(出力)されます。
  • ob_start()関数の後にob_flush()を実行しなくても、出力はされますが、ob_flush()を使わない場合はバッファがフラッシュされないため、出力結果の制御が難しくなります。
回答を見る
  • ベストアンサー

ob_start()した後、ob_flush()しなくても出力される件。

いつもお世話になっております。 バージョン:PHP5.2.5 【1】 <?php ob_start(); echo 'test'; ?> 【2】 <?php ob_start(); echo 'test'; ob_flush(); //【1】との違いはここだけ。 ?> 【1】のように、 ob_flush() の記述のない書き方でも「test」が出力されてしまうのは、なぜなのでしょう? (実際、試してみたところ、出力されてしまいました。) 「?>」の記述をもとに、自動的にflushしちゃう仕様なのでしょうか? 通常であれば、【2】のように書かないと、「test」は出力されないのではと私は思っているのですが…。

  • march4
  • お礼率83% (628/754)
  • PHP
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.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処理が抜けているので、わざわざさいごにフラッシュしてくれている と考えるのが賢明です

march4
質問者

お礼

補足をどうもありがとうございます。 >たしかにマニュアルを見る限り、ob_start()からob_end_clean()もob_end_flush()も指定しない場合はどうなるか書いてないようですね 仰る通りで、私もアレコレ調べてみたのですが、 マニュアル(英文の所では書かれているかもしれませんが)の日本語の部分を読む限りでは、 私が知りたいことについての記述はありませんでした。 >ちなみに「?>で」出力されるのではなく、スクリプトの終了時に出力 されると考えるのが妥当でしょう。 そうですね、色々と試した感じでは、yamabejpさんが仰る通りの仕様であるように思います。 >わざわざさいごにフラッシュしてくれていると考えるのが賢明です 暗黙の了解ということなんでしょうかね。 基礎的なことかもしれませんが、こういったことに関する記述もPHPマニュアルには書いてあって欲しいなと今回思いました。

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

ob_end_clean()でバッファをクリアしてないので、 ためてたバッファがフラッシュされているという解釈でよいのでは?

march4
質問者

お礼

yamabejpさん、どうもありがとうございます。 ob_start();で溜めたバッファは、 フラッシュ処理(例えば、ob_flush()等)をしなくても、 フラッシュされてしまうものなのでしょうか? 前述しましたが、例えば、 「?>」をきっかけに、バッファされているものは、 フラッシュされてしまうのでしょうか? >ob_end_clean()でバッファをクリアしてないので、 >ためてたバッファがフラッシュされているという解釈でよいのでは? 「クリアはしていないので、バッファ内容自体は残っている」 ということは分かっているのですが、 フラッシュ処理をしないのにフラッシュされることに疑問を感じております。 【2】では、フラッシュしているので、出力されるのは理解できますが、 【1】では、フラッシュをしていないのに、出力されているわけです。 この点について、更なるアドバイスを頂けると嬉しいです。 宜しくお願い致します。

関連するQ&A

  • ob_start関数?について教えて下さい

    あるスクリプトを勉強していて、 ob_startと解らない関数がでてきたので PHPマニュアルをみると ob_start -- 出力のバッファリングを有効にする この関数は出力のバッファリングをオンにします。 出力のバッファリングを有効にすると、 (ヘッダ以外の) スクリプトからの出力は実際には行われず、 代わりに内部バッファに保存されます。 と説明がありました。しかしよく説明の意味が理解できずになやんでいます。どなたかわかりやすいように噛み砕いて教えてくただけないでしょうか? ちなみにその関数が使われていたスクリプトは ob_start(); phpinfo(8); $PHPInfoModules = ob_get_contents(); ob_end_clean(); $PHPInfoModules = strip_tags($PHPInfoModules); $GDVersion = stristr($PHPInfoModules, "gd version"); $GDVersion = stristr($GDVersion, "version"); } $GDVersionEnd = strpos($GDVersion, "."); $GDVersion = substr($GDVersion, $GDVersionEnd-1, 1); となっております。上記の関数が参考になればと思います。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHPで出力したhtmlに外部CSSを適用したい

    PHPで出力したhtmlに、外部CSSファイルを適用させたいと考えています。 <?php header('Content-Type: text/html; charset=UTF-8'); ob_start(); echo '<table>'; echo '<tr>'; echo '<td>テスト1</td>'; echo '<td>テスト2</td>'; echo '</tr>'; echo '</table>'; ?> 上記のように、echoでhtmlを出力させているのですが、 これに外部CSSファイルを適用させることは可能でしょうか? 最初の header('Content-Type: text/html; charset=UTF-8'); ob_start(); の部分で、出力後のhtmlファイルの文字セットを指定することが出来たので、 同じような要領でCSSファイルの設定も出来るかなと思ったのですが、 ネットで検索しても出てこず・・・ ご教授いただけないでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • php ob_flushが全く動作しない

    echo "<p>処理を開始します。しばらくお待ちください…</p>\n"; echo str_pad(" ",4096)."\n"; ob_end_flush(); ob_start("mb_output_handler"); for ( $i = 1; $i <= 3; $i++ ) { sleep( 2 ); // 時間がかかる処理 echo "<p>". $i * 10 ."件の処理を完了しました</p>\n"; ob_flush(); flush(); } echo "処理が完了しました\n"; サンプルのプログラムを記述しておきます。 重要な点として、 1.以前は正常に動作していました。 2.サンプル実行で実際の動きを見せるようなっている他サイトも動作しません。   それらは、おそらく、正常に動作しているのでしょうが・・・・。 このプログラムを実行しているサーバーの問題ではない気がします。 なぜなら、他のサンプルサイトの実行結果も、正常に動作しないからです。 firefox , IE8 どちらも、全ての処理が終わってから、まとめて表示されます。 あらゆる対処方を施しましたが、結果は変わりません。 これは、私のパソコンがおかしいのでしょうか? パソコン側で設定する事など出来るのでしょうか? 原因や対処方が分かる方がいらっしゃいましたらご教示お願い致します。

    • ベストアンサー
    • PHP
  • 実行したスクリプト"自体"をob関数でHTML出力

    スクリプト”自分自身”をob_startなどの出力制御関数を使って HTML出力したいのですが、うまく行きません。 以下のように、hoge1.phpというスクリプトを書いて、 別の hoge2.phpをインクルードしてhoge2.phpを HTML出力することはできますが、 ob_start(); include('hoge2.php'); fopen処理 fwite処理 fclose($fd); ob_clean(); たとえば、インプットフォームに文字を入力して、 受け取る。そして表示。 と同時にHTMLファイルを書き出して保存する場合、 どのようにスクリプトを書けばいいでしょうか。 お手数おかけしますが。お力を貸してください。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • cakephp1.2で画像が出力できない!

    お世話になります。cakephp1.2で解決できないことがあります。 それは画像の出力です。 app/webroot/img配下にtest.jpgがある場合、 どのように表記したらビューで出力できるでしょうか? <?php echo $html->image('test.jpg') ; ?> や絶対パス、cake.power.pngなどの出力テスト をいろいろ試しましたが、どうしても解決できません>< どうかみなさま宜しくお願い致します。 暫くプログラマの方と連携がとれないので、 こちらに質問させて頂きました。。。

    • ベストアンサー
    • PHP
  • GETで?の後ろのnameをなしにしたい

    【PHP】 GETでパラメータを取得したいです。 通常、 hoge.php?q=hogehoge ↓ echo $_GET["q"]; ↓ hogehoge などとなりますよね? でも、 hoge.php?hogehoge ↓ echo $_GET["●●"]; ↓ hogehoge 出力、みたいにしたいのですが.. hoge.php?hogehoge&mogemoge とか hoge.php?hogehoge&a=mogemoge とかできたら尚良いです。 どうしたらいいのでしょうか? ●●部分を空白にする、とか? 仕様的に無理なんでしょうか? ご教示頂けましたら幸いです。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 見やすく出力させたいです。

    PHPでのXMLデータを呼び込んだら、 まつお東京20010203 とき大阪20090625 ひまわり東京20100206 このように格好わるく出力されました。 これを下記のように見やすく出力させたいですがどうしたらいいですか? まつお   東京    20010203 とき     大阪    20090625 ひまわり  東京    20100206 下記はphpソースです。 ...省略 echo "<?xml version=\"1.0\"?>\n"; echo "<dogDB>\n"; while($line = mysql_fetch_assoc ($result)){ echo "<item>" . $line["name"] . $line["sumai"] .$line["birthady"] ."</item>\n"; } echo "</dogDB>\n"; ...省略 ご教授よろしくお願いします。

    • 締切済み
    • PHP
  • 見やすく出力させたいです。

    DB→PHPでのXMLデータを呼び出し→Flashに出力 すると下記のように このように格好わるく出力されます。 まつお東京20010203 とき大阪20090625 ひまわり東京20100206 これを下記のように見やすく出力させたいですがどうしたらいいですか? まつお   東京    20010203 とき     大阪    20090625 ひまわり  東京    20100206 アクションスクリプトソースです。AS(2.0) var theXML:XML = new XML(); theXML.ignoreWhite = true; theXML.onLoad = function() { var nodes = this.firstChild.childNodes; for(i=0; i<nodes.length; i++) { thelist.addItem(nodes[i].firstChild.nodeValue,i); } } theXML.load("http://XXXX/doglist.php?dog=8); 下記はphpソースです。 ...省略 echo "<?xml version=\"1.0\"?>\n"; echo "<dogDB>\n"; while($line = mysql_fetch_assoc ($result)){ echo "<item>" . $line["name"] . $line["sumai"] .$line["birthady"] ."</item>\n"; } echo "</dogDB>\n"; ...省略 ご教授よろしくお願いいたします。

  • 標準出力とログファイルへの書き出し

    初歩的な質問ですみません。 以下のようにするとログファイルにechoの内容が出力 されますが、標準出力には出力されないようになります。 echo "log" >> test.log 標準出力とログファイル両方に出力したい場合はどのように記述 すればよいでしょうか?

  • phpプログラムにてすぐecho出力が出ない。

    phpにて、ログ解析を解析し、解析結果をCSVに加工して出力するものを 作成しました。 ログの解析には、解析したい単語で正規表現を使用し、 抽出しています。 正規表現は一行につき、多い場合で5つ実行されます。 echoでところどころに変数を出力するようにしています。 phpの<?phpのすぐ下にも startと出力するようにechoを入れています。 ログのボリュームにもよるのですが、 サイズが大きいログの場合、 解析プログラムを実行しても、最初のうちは、ふんともすんとも しないのです。 5000行のログでは、1時間たっても、実行されず、echoの標準出力が発行されず、 100行程度の場合、数秒でechoの標準出力が出力されます。 すこし、経つと、思い出したかのように 標準出力を吐き出します。 phpのプログラムにおいて、 実行する場合に、どのようなソースチェックが行われているのでしょうか?? すこし、わかりづらい質問ですが、 詳しい方、宜しくお願いいたします。

    • ベストアンサー
    • PHP

専門家に質問してみよう