痔になりやすい生活習慣とは?

質問致します。PHPスクリプトを処理する際、全て処理し終わった後、いっきにページに表示されるのが普通だと思うのですが、これを段階的に表示したいのですが、それには出力バッファをオフにする。つまりflush()関数を使えばOKと聞きました。以下の例でいえば、どの場所にこのflush()関数を入れれば良いのでしょうか?

<?php
$Name=array("Aさん","Bさん","Cさん","Dさん","Eさん","Fさん"・・・この後1000件続く);
$Count=array(123,198,123,117,123,202・・・この後1000件続く);
array_multisort($Count,SORT_DESC,SORT_NUMERIC,$Name,SORT_DESC,SORT_STRING);

print("第1位:".$Count[0]." ".$Name[0]."<br>");
for($i=1;$i<count($Name);$i++){
if($Count[$i] != $Count[$i-1]){
print("第".($i+1)."位:".$Count[$i]." ");
}
print($Name[$i]."<br>");
}
?>

以上のように1000件もの順位を表す為、徐々に表示したいというのが私のやりたい事です。
参考ページ(http://oshiete1.goo.ne.jp/kotaeru.php3?q=1248483)等を見たのですが、初心者な者で太刀打ちできないでおります。
具体的にflush()関数をここに入れるという風にご指摘頂ければ幸いでございます。よろしくお願い致します。

このQ&Aに関連する最新のQ&A

desc」に関するQ&A: 【バグ?】ORDER BY DESCでempty

A 回答 (3件)

print("第1位:".$Count[0]." ".$Name[0]."<br>");


for($i=1;$i<count($Name);$i++){
if($Count[$i] != $Count[$i-1]){
print("第".($i+1)."位:".$Count[$i]." ");
}
print($Name[$i]."<br>");
ob_flush();
flush();
}

この回答への補足

ご返信ありがとうございます。
print 以降の部分にテーブルを使っている場合、例えば、以下のような場合ではいかがでしょうか?

<?php
$Name=array("Aさん","Bさん","Cさん","Dさん","Eさん","Fさん"・・・この後1000件続く);
$Count=array(123,198,123,117,123,202・・・この後1000件続く);
array_multisort($Count,SORT_DESC,SORT_NUMERIC,$Name,SORT_DESC,SORT_STRING);

$rank=1;
for($i=0;$i<count($Name);$i++){
print("<table border='0' cellspacing='1' cellpadding='0' width='270' bgcolor='#999999'><tr bgcolor='#FFFFFF'><td id='key1' width='40'>第".$rank."位</td><td id='key1'>".$Name[$i]."</td><td id='key1' width='30'>".$Count[$i]."</td></tr></table>");
if($Count[$i] != $Count[$i+1]){
$rank=$i+2;
}
}
?>

以上のスクリプト文の場合も、ob_flush(); と
flush(); を同じところに入れればOKでしょうか?一度試してみたのですが、徐々に(段階的に)表示されず、何秒後かに一挙に表示されてしまします。お手数お掛けしますがよろしくお願い致します。

補足日時:2006/09/27 21:17
    • good
    • 0
この回答へのお礼

質問をほったらかしにしてしまい申し訳ございません。ありがとうございました。また何かございましたら宜しくお願い致します。

お礼日時:2006/10/01 09:37
    • good
    • 0

TABLEタグは最後まで出力しないとブラウザが表示しないので


TABLEタグをやめるか、CSSで段階的に表示する設定ができたと思います。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qphp 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 どちらも、全ての処理が終わってから、まとめて表示されます。

あらゆる対処方を施しましたが、結果は変わりません。

これは、私のパソコンがおかしいのでしょうか?
パソコン側で設定する事など出来るのでしょうか?

原因や対処方が分かる方がいらっしゃいましたらご教示お願い致します。

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.サンプル実行で実際の動きを見せるようなっている他サイトも動作しません...続きを読む

Aベストアンサー

ブラウザの仕様の問題でしょうね。
かならずしも受け取ったデータをすぐに表示するのが効率的というわけでは
ないので、ブラウザ側でためてから出力しているのかもしれません

ajaxなど非同期処理でデータを抽出する方が現実的だと思いますよ

Qページを段階的に表示するには

下記の参考URLのように、いったん表などを先に表示してしまい、
その後に時間のかかる処理を行い、少しずつ表示されていくようにしたいのですが、
やり方がわかりません。

参考URLを真似してみたのですが、ページ全体が表示されるまで
どうしても画面が止まってしまいます。(たまに2~3段階にわけて表示される)
ソースを見る限りJavaScriptで後半に実際の数値や文字列を
ページに追加していっているのだと思いますが、それ以上が分かりません。

どう検索していいのものか分からず困っています。
ご存知の方がいらっしゃいましたらご教授くださいませ。

《参考URL》
http://www.muryoutouroku.com/free/free06.html
http://www.it-work.jp/samples/gsearch/

Aベストアンサー

こんにちは。

えっと、おそらくテーブルタグを使用していた場合において、画面が止まって見えるというのは、テーブルタグの閉じタグが出力されていないためだと思われます。
そして、テーブルの閉じタグは時間のかかる処理の前に出力した方がよいのですが、まず以下の実験をしてみてください。以下の実験において、ブラウザはIE(インターネットエクスプローラー)とします。

<?
for($i=0;$i<5;$i++) {
print "b";
flush();
sleep(1);
}
?>

おそらく、やはり画面が真っ白のまま5秒後に「b」が5つ表示されたと思います。
では、以下に修正します。
aaaaaaaaaaa
<?
for($i=0;$i<5;$i++) {
print "d";flush();
sleep(1);
}
?>

これでも、同じような結果になったと思います。では、次に以下のように修正します。

<BR>
<?
for($i=0;$i<5;$i++) {
print "d";flush();
sleep(1);
}
?>

詳しくは知りませんが、IEは256バイト分のデータ(改行や空白文字でもかまいません)を受け取らないと、真っ白のままのようです。が、「改行タグ」を一個でもうけとると即座に受け取ったデータを表示してくれました。
より具体的に修正すると、

<HTML><HEAD><TITLE>TEST</TITLE></HEAD>
<BODY>
<table width="450" border="1" cellspacing="0" cellpadding="0">
<tr>
<td bgcolor="#0FFF000" height="200">a </td>
</tr>
</TABLE>←時間のかかる処理をやる前に必ず出力してテーブルタグを終了させる
<?
for($i=0;$i<5;$i++) {
print "d";flush();
sleep(1);
}
?>


サーバ側の方なんですが、ブラウザに出力する前に、バッファが満タンにならないと送信しない設定になっていることが多いので、「flush関数」でその処理を無効にします。

時間のかかる処理をJavaScriptでやるかサーバ内でやるかは別にして、どちらにしろテーブルを形成した後、文字や数字で埋めていくには、JavaScriptしかないと思います。
そういった処理は、JavaScript専門の方でお聞きください。
昔、JavaScriptで似たようなことはやりましたがなにせ、だいぶ前のことで・・・。(^ ^ ;ゞ

こんにちは。

えっと、おそらくテーブルタグを使用していた場合において、画面が止まって見えるというのは、テーブルタグの閉じタグが出力されていないためだと思われます。
そして、テーブルの閉じタグは時間のかかる処理の前に出力した方がよいのですが、まず以下の実験をしてみてください。以下の実験において、ブラウザはIE(インターネットエクスプローラー)とします。

<?
for($i=0;$i<5;$i++) {
print "b";
flush();
sleep(1);
}
?>

おそらく、やはり画面が真っ白のまま5秒後に「b」が5つ...続きを読む


人気Q&Aランキング