私はかなり長いデータマイニングスクリプトを持っており、その一部でいくつかの情報をページにエコーします(実際には、foreachループ中に)。
しかし、私は情報が私が望んでいたようにすぐにではなく、「セグメント」でブラウズに送信されていることに気づいています。
エコー後にすべてのデータをブラウザにすぐに送信するために使用できる機能はありますか?
ありがとう。
あなたはおそらくしたいですflush()
。ただし、PHP は出力バッファリングを使用している可能性があります。これにより状況が変わる可能性があるいくつかの方法がありますが、一言で言えば、次のことができflush()
ますob_flush()
。
はい、出力を 1024 バイトにパディングすると、ほとんどのブラウザーでコンテンツの表示が開始されます。
しかし、@nobody の質問 "各 `echo` 呼び出しの後に出力をフラッシュする方法は? " に対する回答から、1024 バイトのブラウザ バッファリング効果は、ブラウザがページの文字エンコーディングを推測する必要がある場合にのみ発生することもわかります。適切な Content-Type ヘッダー (例: "Content-Type: text/html; charset=utf-8") を送信するか、適切な html メタ タグを使用してコンテンツの文字セットを指定します。そして、すべてのブラウザで同様に機能しました。
したがって、基本的に、行う必要があるのは次のとおりです。
header('Content-Type: text/html; charset=utf-8');
ob_implicit_flush(true);
追加のパディングやフラッシングが不要なため、コードの外観に大きなメリットがあります。もちろん、ヘッダーはコンテンツの前に送信する必要があり、出力バッファリングが行われていないことも確認する必要があります。
問題は間違いなく解決しました!うまくいく場合は、他の質問に対する@nobodyの回答も(+1)してください。それでも問題が発生する場合は、暗黙のフラッシュが正しく機能しないと思われる他の特定の状況について、他の質問への回答を確認することをお勧めします。
各エコーの後に flush() を使用してみることができますが、実行している Web サーバーによっては、クライアントへの書き込みが保証されません。
一部のブラウザは、応答の本文に256バイトや1024バイトなどの特定の量のデータが含まれるまで、何も表示し始めないことにも注意してください。そのパッドデータの前に、フラッシュを実行する前に、ページの上部近くに1024文字の長いコメントが付いたアプリケーションを見たことがあります。ちょっとしたハックですが、必要です。
これは、InternetExplorerとSafariIIRCに適用されます。
それで、
私はただ使うのが好きです
while (ob_get_level()) ob_end_flush();
スクリプトの先頭近くのどこかで、
flush();
フラッシュしたいときはいつでも。これは、スクリプトの前に(PHP.iniやhtaccess構成などで)設定されている場合でも、出力バッファリングがまったく必要ないことを前提としています。
このようなものを使用して、出力を強制的にすぐに送信できるはずです。出力を送信するコードの部分に配置します。
flush();
ob_flush();
ふぅ!Google Chrome のバッファの問題に対する答えがついに見つかりました! 正しい方向に進んでくれた Boysmakesh に感謝します。私が使用する関数は次のとおりです。
function buffer_flush(){
echo str_pad('', 512);
echo '<!-- -->';
if(ob_get_length()){
@ob_flush();
@flush();
@ob_end_flush();
}
@ob_start();
}
そして、これは私がそれを呼ぶ方法です:
show_view('global', 'header'); // Echos the <html><head>... tags and
// includes JS and CSS.
show_view('global', 'splash_screen'); // Shows a loading image telling
// the user that everything's okay.
buffer_flush(); // Pretty obvious. At this point the loading view shows
// up on every browser i've tested (chrome, firefox,
// IE 7 & 8)
show_view('global', 'main'); // Has a loop that echos "Test $i<br>" 5
// times and calls buffer_flush() each time.
show_view('global', 'footer'); // End the html page and use JQuery to
// fade out the loading view.
Google chromeでこれを完全に解決するには、これを試してください:
$i = 0;
$padstr = str_pad("",512," ");
echo $padstr;
while ($i <= 4){
$padstr = str_pad("",512," ");
echo $padstr;
echo "boysmakesh <BR> ";
flush();
sleep(2);
$i = $i + 1;
}
Ee は、各エコーを送信する前に 512 バイトを送信しています。<BR>
フラッシュする前にコンテンツの最後に置くことを忘れないでください。それ以外の場合、Chrome では機能しませんが、IE では機能します。
パディングするデータはブラウザに依存します。一部のブラウザーでは 256 バイトで十分ですが、一部のブラウザーでは 1024 バイトが必要です。クロムの場合は 512 です。
IIS 7、IE 11 (win サーバー) で php 5.5 を実行すると、これがファイルの開始行として機能することがわかりました。ヘッダーの前に while ステートメントを置くと、header already written エラーが発生することに注意してください。
header('Content-Type: text/html; charset=utf-8');
while (ob_get_level()) ob_end_flush();
ob_implicit_flush(true);
スクリプト内でさらに ob_flush() を参照すると、バッファが存在しないというエラーが発生しました。
これは、ファイルを処理してSQLステートメントをブラウザに送信しているときにうまく機能しましたが、データベース(msサーバー2008)を接続すると、スクリプトが完了するまで入力が返されませんでした.
ignore_user_abort(TRUE); // run script in background
set_time_limit(0); // run script forever
$interval=150000;
$i = 0;
if(
strpos($_SERVER["HTTP_USER_AGENT"], "Gecko") or
strpos($_SERVER["HTTP_USER_AGENT"], "WebKit")
){
# important to change browser into quirks mode
echo '<?xml version="1.0" encoding="iso-8859-1"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">';
}
function buffer_flush(){
echo "\n\n<!-- Deal with browser-related buffering by sending some incompressible strings -->\n\n";
for ( $i = 0; $i < 5; $i++ )
echo "<!-- abcdefghijklmnopqrstuvwxyz1234567890aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz11223344556677889900abacbcbdcdcededfefegfgfhghgihihjijikjkjlklkmlmlnmnmononpopoqpqprqrqsrsrtstsubcbcdcdedefefgfabcadefbghicjkldmnoepqrfstugvwxhyz1i234j567k890laabmbccnddeoeffpgghqhiirjjksklltmmnunoovppqwqrrxsstytuuzvvw0wxx1yyz2z113223434455666777889890091abc2def3ghi4jkl5mno6pqr7stu8vwx9yz11aab2bcc3dd4ee5ff6gg7hh8ii9j0jk1kl2lmm3nnoo4p5pq6qrr7ss8tt9uuvv0wwx1x2yyzz13aba4cbcb5dcdc6dedfef8egf9gfh0ghg1ihi2hji3jik4jkj5lkl6kml7mln8mnm9ono -->\n\n";
while ( ob_get_level() )
ob_end_flush();
if(ob_get_length()){
@ob_flush();
@flush();
@ob_end_flush();
}
@ob_start();
}
ob_start();
do{
if($i<10){
buffer_flush();
echo ". ";
buffer_flush();
usleep($interval);
} else {
echo sprintf("<pre>%s</pre>", print_r($_SERVER,true));
break;
}
$i++;
}while(true);