php ob_flushが全く動作しない

このQ&Aのポイント
  • PHPのob_flush関数が正常に動作せず、処理がまとめて表示される問題が発生しています。
  • 他のサンプルサイトでも同様の問題が発生しており、サーバーの問題ではない可能性があります。
  • 対処法を試しても問題が解決しないため、パソコン側の設定を確認する必要があるかもしれません。
回答を見る
  • ベストアンサー

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
  • 回答数2
  • ありがとう数2

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

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

ブラウザの仕様の問題でしょうね。 かならずしも受け取ったデータをすぐに表示するのが効率的というわけでは ないので、ブラウザ側でためてから出力しているのかもしれません ajaxなど非同期処理でデータを抽出する方が現実的だと思いますよ

mintohime
質問者

お礼

ありがとうございます。 やはり、ブラウザの仕様なのでしょうか。 Firefox、IE8ともに、ダメって事ですね。 至急対応したい処理でしたので、とりあえずは他の方法で対処する事にしました。 ですので、ajaxはこれから勉強して今後取り入れたいと思います。 ありがとうございました。

その他の回答 (1)

回答No.2

http://www.php.net/manual/ja/function.flush.php より ” PHP および PHP が使っている (CGI, Web サーバなどの) バックエンドの書き込みバッファをフラッシュします。 それまでのすべての出力をユーザのブラウザに対して出力しようと試みますが、 注意すべき点があります。 flush() はウェブサーバのバッファリング手法を上書きすることはできません。 また、クライアント側のブラウザでのバッファリングにはなんの影響も及ぼしません。 PHP のユーザレベルでの出力バッファリングの仕組みにも影響を及ぼしません。 つまり、もし ob 出力バッファを使用しているのなら ob_flush() と flush() の両方をコールしなければなりません。 いくつかのサーバ、特に Win32 上ではスクリプトからの出力をブラウザに 結果を送信する前にスクリプトが終了するまでバッファに溜めることがあります。 mod_gzip のような Apache 用のサーバモジュールはそれ自体がバッファリングを行います。 そのため、flush() をコールしても 即時にデータをクライアントに送信しないという結果につながります。 ”

mintohime
質問者

お礼

ありがとうございます。 上記ページに従って、何パターンも作成しました、また、mod_gzipの件も対処しましたが 結果は同じでした。 利用しているサーバーのみ、正常に動作しないなら、理解できますが、 他の方がサンプル実行例として記載している、沢山のサイトでも 正常に動作しないという点で、私のパソコンだけが何らかの原因でそうなっているのかと 思った次第です。 結果、違うやり方で、処理する事にしました。 ありがとうございました。

関連するQ&A

  • IE8でのPHPの処理の途中結果表示方法について

    PHPの処理の途中結果を表示させようとして、下記ブラウザで結果を確認しました。 -処理内容- for($i = 0;$i<10;$i++){ ~とある処理~ ob_flush(); flush(); } --- ・Firefox ・Google Chrome  ・Internet Explorer 8(以下IE8) IE8以外だと想定通りの結果が表示されますが、IE8のみ、全ての処理が完了してから、表示されます。 Googleで検索した所、IE(IE8かどうかは不明)だと256バイトの出力を受けてからページを表示し始める、と書いてあったので、下記処理を追加しました。 参考:http://php.net/manual/ja/function.flush.php -処理内容- for($i = 0;$i<10;$i++){ ~とある処理~ for($ie = 0;$ie<256;$ie++){ echo ' '; } ob_flush(); flush(); } --- しかし、結果は変わりませんでした。 IE8で、PHPの処理の途中結果を表示させる方法についてアドバイス頂けないでしょうか。 宜しくお願い致します。

    • 締切済み
    • PHP
  • PHPとjquery

    PHPの内部処理をjqueryを使ってブラウザ上で進捗状況をリアルタイムで見せてくれるようなものは作れますか? jqueryで動的なwebページを作れると聞いての質問なのですが。jqueryは少ししか触っていません 例えば <?php $i = 1; while( $i <= 10 ){ echo "実行中<br>\n"; $i++; sleep(5); } ?> というプログラムがあって、普通に実行したらまとめて10個の"実行中"が表示されるだけですが、これをプログラム処理と同期させてページを更新させること無しに一つづつブラウザに表示させて行くというような処理は可能なのでしょうか?教えてください

  • require Auth.php

    require 'Auth/Auth.php'; の動作について教えてください。 サンプルソース a.php に、 「require 'Auth/Auth.php';」と冒頭に記述してありました。 PEARだと思うのですが、結局この記述は、 a.phpに、 (1)Auth.phpの内容を取り込む? (2)Auth.phpの内容を継承する? どちらの解釈の方が正しいのでしょうか? 今までrequire だと、指定したphpの内容を取り込む((1)番だと)だと認識していました。 以下ソースのように動作してると思っています。Auth.phpも同じ動作と思っていいものなのでしょうか。 ・test.php <?php echo "start!!\n"; include("include.php"); echo "end!!\n"; ?> ・include.php <?php echo "include start!!\n" ?> ●実行結果 start!! include start!! end!!

    • ベストアンサー
    • PHP
  • .htmlで.phpの動作について(xサーバ)

    何故かif文の処理がされなくて困っています。なぜ制御部分が動作しないのでしょうか?原因がわからないので、わかる方お願いします。 ファイル1 kounyuu.html <!DOCTYPE html> <html lang ="ja"> <head> <meta charset="UTF-8"> <title>ジュースの購入 </title> </head> <body> <form action ="result.php" method='post'> <p>120円のジュースを販売<br> 1000円までのお金をいれてください。<p> <p>お金を<input type="text" name="money" size="5">円入れます。</p> <p><input type='submit' value="購入"></p> </form> </body> </html> ファイル2 result.php <!DOCTYPE html> <html lang ="ja"> <head> <meta charset="UTF-8"> <title>おつり</title> </head> <body> <?php $m = $_POST['money']; $r = $m -120; $kouka = array{500,100,50,10,0}; if($r < 0){ print "<P>お金がありません</p>\n"; } elseif($m > 1000){ print "<p>1000円お願いします</p>\n"; } elseif($r == 0){ print "<p>ちょうどお預かりします。ありがとうございました。<p>\n"; } else{ print "<p>ありがとうございました。おつりは &r 円になります。</p>\n"; print "<p>硬貨の枚数は次のとおりです。<br>\n"; $i = 0; while($kouka[$i]>0){ print $kouka[$i]."円玉".(int)($r / $kouka[$i])."枚<br>"; $r = $r % $kouka[i]; $i++; } } print "</p>"; ?> <p><a href="kounyuu.html">お金を入れなおす</a> </p> </body> </html> フォームに1000と入力した結果↓ お金がありません \n"; } elseif($m > 1000){ print " 1000円お願いします \n"; } elseif($r == 0){ print " ちょうどお預かりします。ありがとうございました。 \n"; } else{ print " ありがとうございました。おつりは &r 円になります。 \n"; print " 硬貨の枚数は次のとおりです。 \n"; $i = 0; while($kouka[$i]>0){ print $kouka[$i]."円玉".(int)($r / $kouka[$i])."枚 "; $r = $r % $kouka[i]; $i++; } } print " "; ?> お金を入れなおす

  • Flash Playerが正常に動作しません

    「Flashプレイヤーが古い為に動作しない」旨のメッセージが出たので、最新のFlash Player(9.0.124.0 )をインストールしたのですが、それでも「バージョンが古い」と表示され、Flash Playerが正常に動作しません。 参考までに、ニコニコ動画や「Flash Player Version 7,0,19,0」以上が必要とされるデジタルステージ社製「ID」で作成されたサイト等の表示がされていません。 尚、Firefoxも同時に使用しておりますが、こちらに関しては何の問題も無く正常に動作しております。 ソフト・Windowsの再起動や、クッキー・キャッシュの削除等も行いましたが結果は同じです。 IEのバーにおいて「このサイトによる、安全でない方法でのActiveXコントロールの使用は、IEでブロックされています、。このため、このページが正しく表示されない可能性があります。」という表示がでております。このメッセージが表示されているのはAdobe社のFlash Playerインストール用のページで、インストール完了後に表示されます。

  • PHPの問題

    以下のプログラムをご覧ください: <? $a = 5; if ($a != 5) { echo "$a 不是 5"; } else { echo "$a 是 5"; } ?> 実行結果は:$a 是 5 このプログラムの"&#036"はなんでしょう?私が“;a 是 5”を削除してみたら実行結果は:$になる。 "&#036”は“$”ですか

    • ベストアンサー
    • PHP
  • phpの対話型実行ツール?

    関数の挙動を確認したいとき、対話型で実行できると便利だと思うのですが、そのようなツールはないでしょうか?あるいは、みなさんはどうやっていますか? 今のところ、echo '<?php echo str_replace("A","","ABC");?>' | php -q のようにしています。こういう単純なケースは、面倒なだけでまだ良いのですが、確認した値を使って次の動作をしたいときなど、どうしようもありません。 Ruby言語での対話型処理の例: $ irb irb(main):001:0> f=File.open('sample.txt','r') => #<File:sample.txt> irb(main):002:0> f.gets => "line 1 of file\n" irb(main):003:0>

    • 締切済み
    • PHP
  • シェルの -eq の動作について

    シェルの -eq の動作について質問があります。 次のプログラムの動作を例に挙げます。 【ファイル名:A.sh】 #!/bin/sh readonly A=666 B=A echo $B if [ $B -eq 666 ]; then echo XXXXXXX exit 0 fi 「実行方法」 sh B.sh 「実行結果」 A XXXXXXX 【ファイル名:B.sh】 #!/bin/sh readonly A=666 B=A echo $B if [ $B -eq 667 ]; then echo XXXXXXX exit 0 fi 「実行方法」 sh B.sh 「実行結果」 A -Question- A.shを実行すると、処理がif文に入ってしまう理由を教えてください。 変数Bが二重参照しているような気がするのですが、 そのような機能が sh にあるのでしょうか?

  • jQueryのAjaxで通信の途中結果を取得したい

    jqueryのajaxを使って通信先のphpが発行するhtmlを受信して受信側の<div id="data"></div>に 表示させているのですが、通信先のphpが処理して生成したhtmlの途中結果を受信して 表示させるにはどのようにすれば良いのでしょうか? 例えば通信先のphpを <?php ob_start(); for ( $i = 1; $i <= 100000; $i++ ) {  if ($i % 100 == 0) {   echo "■";  }  @ob_flush();  @flush();  usleep(30000); } ?> このようにして受信側を <div id="data">■■■</div> というようにプログレスバーみたいに次々と■を増やしていきたいのですが、実行してみると最終結果の <div id="data">■■■■■■■■■■■■■■■■■■■■■■■■(…省略)</div> だけが出力されてしまいます。 どのようにすれば良いのか教えて頂きたいです。 どうぞよろしくお願い致します。

    • ベストアンサー
    • AJAX
  • シェル 会話形式でエンターキーの動作は?

    シェル内で、ENTERキーを押した時の動作をしたいと思います。 具体的には、もともと「telnetする、接続→ある値を入力する→ENTERを押す→入力した値に合わせたテキストが出力される→connection終了」という処理があり、 これを自動化して、出力されたテキストをファイルに保存するためのシェルを作りたいのです。 作ってみたところ、1点だけできないのがENTERキーを押す部分です。 シェルを実行すると、値の入力まで行われた状態で終わってしまいます。 そこで手動でENTERを押せば、正常に処理が終了します。 おそらく、会話形式でENTERを押した時の処理がうまくかけていないと思っています。 echo -e "\r\n"などいろいろ試したのですが・・・ echoではないのではないかと推測していますが、行き詰まりました。 どのようにしたらよいのかご教授ください。

専門家に質問してみよう