マニュアルで説明されている
ob_flush/flush は両方とも出力バッファをフラッシュするものであり、一緒に使用する必要があるため、多くの人に混乱を引き起こす可能性があります...
実際、場合によっては、flush は異なるオブジェクトに対して動作します。 all. 物事...
ob_* シリーズ関数は、PHP 自体の出力バッファを操作します。
そのため、ob_flush は PHP 自身のバッファを更新します。
そして、フラッシュは、厳密に言えば、PHP が Apache モジュールとして使用されている場合にのみ使用できます。 (ハンドラーまたはフィルター) は、インストールされた場合にのみ実際の効果を持ちます。WebServer のバッファー (特に Apache を参照すると考えられます) をリフレッシュします。
Apache モジュールの sapi の下で、flush メンバー関数が間接的に呼び出されます。 apache の API を呼び出す: ap_rflush は Apache の出力バッファを更新します。もちろん、マニュアルには、このアクションの結果を変更する可能性のある他の Apache モジュールがあるとも記載されています...
mod_gzip などの一部の Apache モジュールは、自分で実行 出力キャッシュ。これにより、flush() 関数によって生成された結果がクライアントのブラウザーにすぐに送信されなくなります。 ブラウザでも、受信したコンテンツを表示する前にキャッシュします。たとえば、Netscape ブラウザは、改行または HTML タグの先頭を受け取るまでコンテンツをキャッシュし、 タグを受け取るまでテーブル全体を表示しません。
Microsoft Internet Explorer の一部のバージョンは、256 バイトを受信した後にのみページの表示を開始するため、これらのブラウザーがページのコンテンツを表示できるようにするには、追加のスペースを送信する必要があります。 したがって、この 2 つを使用する正しい順序は、最初に ob_flush、次にフラッシュです。もちろん、他の sapi では、flush を呼び出さなくても問題ありません。ただし、コードの移植性を確保するために、これらを使用することをお勧めします。
flush と ob_flush 出力バッファーのリフレッシュを妨げる特別な考慮事項がいくつかあります。
1. フラッシュと ob_flush の正しい順序は、次のようになります。
ob_flush();
Web サーバーのオペレーティング システムが Windows システムの場合は、順序を逆にします。 ob_flush() を使用しなくても問題は発生しません。ただし、Linux システムでは、出力バッファをフラッシュできません。
print str_repeat(" ", 4096);
を使用して、output_buffering 値に到達することを確認します。
<?php for ($i=1; $i<20; $i++) { echo "<font size='10' color='red'>".$i."</font>"; echo '<br>'; ob_flush(); flush(); sleep(1); } ob_end_flush(); ?>