2

例えば、

これは機能しません (Firefox 21、IE8):

<?php
function flush_buffers(){
    ob_end_flush();
    ob_flush();
    flush();
    ob_start();
}  
ob_start();
echo 'Text 1<br />';
flush_buffers();
Sleep(2);
echo 'Text 2<br />';
flush_buffers();
Sleep(2);
echo 'Text 3<br />';
flush_buffers();
Sleep(2);
echo 'Text 4<br />';
?>

しかし、これは機能します:

<?php
function flush_buffers(){
    echo str_pad('',4096);
    ob_end_flush();
    ob_flush();
    flush();
    ob_start();
}  
ob_start();
echo 'Text 1<br />';
flush_buffers();
Sleep(2);
echo 'Text 2<br />';
flush_buffers();
Sleep(2);
echo 'Text 3<br />';
flush_buffers();
Sleep(2);
echo 'Text 4<br />';
?>

Win XP SP3 で PHP 5.4.11 VC9 と Apache 2.4.3 (apacheLounge) を実行しています。

4

4 に答える 4

5

一部のブラウザには、途切れを少なくしてより効率的にダウンロードして表示するために、独自の内部バッファが含まれています。ほとんどの場合、このバッファは 4Kb または 4096 バイトです。

str_pad('',4096)出力に 4,096 個のスペースを書き込むことです。HTML であるため、これらのスペースは 1 つのスペースに折りたたまれます。

全体として、この動作は信頼すべきではありません。ブラウザーは Web ページを表示するためのものであり、コンソール端末にアクセスするためのものではありません。

また、なぜあなたは書いているの</br>ですか?終了タグのようなものはなく<br>、自己終了バージョンは<br />

于 2013-01-29T02:04:34.523 に答える
1

ブラウザーのバージョンを指定するだけでなく、PHP が実行されている Web サーバーも指定する必要があります。結局のところ、出力バッファリングがおそらく発生している場所です。

flushのドキュメントを読むと、動作が保証されていないことがわかります。ライブラリとOSが連携していても、(おそらく)それをバッファリングするためのディスクハードウェアがまだあるディスク書き込みのようなものです。最も細心の注意を払った (したがって移植がほとんど不可能な) メソッドのみが機能し、それでさえ保証されていません。

編集:ああ、そうです、ブラウザ(または地獄、その間のルーターまたはTCPスタック)もそれを行うことができます.

于 2013-01-29T02:02:45.183 に答える
0

これは、ブラウザーのレンダリング エンジンがコンテンツを画面にレンダリングする際に、十分なデータを取得する必要があるためです。また、必要なデータ量はブラウザによって決定されます。

于 2013-01-29T02:00:14.523 に答える