php
におけるob_flushとflushの違い
Ob_flush/flush については PHP マニュアルで説明されています。どちらも出力バッファをリフレッシュするため、組み合わせて使用する必要があります。
実際には、操作対象が異なる場合もあります。flush はまったく実行しません。
ob_* 系の関数は、PHP 自体の出力バッファを操作します。
つまり、ob_flush は PHP 自身のバッファをリフレッシュすることです。フラッシュは、厳密に言えば、PHP が Apache モジュール (ハンドラーまたはフィルター) としてインストールされている場合にのみ、Web サーバー (特に Apache と考えられます) のバッファーをリフレッシュします。
Apache モジュールの sapi では、flush は sapi_module のフラッシュ メンバー関数ポインタを呼び出すことで間接的に Apache の API を呼び出します。 ap_rflush は Apache の出力バッファを更新します。 もちろん、マニュアルには、Apache の他のモジュールが存在する可能性があるとも記載されています。このアクションの結果を変更します。
mod_gzip などの一部の Apache モジュールは、独自の出力をキャッシュする場合があり、そのため、flush() 関数によって生成された結果がクライアントのブラウザにすぐに送信されなくなります。
ブラウザでも、受信したコンテンツを表示する前にキャッシュします。たとえば、Netscape ブラウザは改行または HTML タグの先頭を受け取るまでコンテンツをキャッシュし、f16b1740fad44fb09bfe928bcc527e08 タグを受け取るまでテーブル全体を表示しません。
Microsoft Internet Explorer の一部のバージョンでは、256 バイトを受信した後にのみページの表示が開始されるため、これらのブラウザでページのコンテンツを表示できるようにするには、追加のスペースを送信する必要があります。
したがって、この 2 つの使用の正しい順序は、最初に ob_flush、次にフラッシュです。Web サーバーのオペレーティング システムが Windows システムの場合は、順序を逆にしても、ob_flush() にしても問題ありません。は使用されていません。ただし、Linux システムでは、出力バッファをフラッシュできません。
もちろん、他の sapi では、flush を呼び出す必要はありませんが、コードの移植性を確保するために、フラッシュを併用することをお勧めします。
上記の説明に基づいて、次のテストを実行します:
テスト 1、
<?php ob_start(); echo '1'; ob_flush();//输出php缓存并刷新 echo '2'; ob_flush();//输出php缓存并刷新 $cc = ob_get_contents(); ob_end_clean(); var_dump()($cc); ?>
<?php ob_start(); echo '1'; flush(); //输出apache缓存并刷新 echo '2'; flush(); //输出apache缓存并刷新 $cc = ob_get_contents(); ob_end_clean(); var_dump($cc); //by www.jbxue.com ?>
<?php ob_start(); echo '1'; ob_flush();//输出php缓存并刷新 flush();//输出apache缓存并刷新 echo '2'; ob_flush();//输出php缓存并刷新 flush();//输出apache缓存并刷新 $cc = ob_get_contents(); ob_end_clean(); var_dump($cc); //by www.jbxue.com ?>
<?php ob_start(); echo '1'; flush();//输出apache缓存并刷新 ob_flush();//输出php缓存并刷新 echo '2'; flush();//输出apache缓存并刷新 ob_flush();//输出php缓存并刷新 $cc = ob_get_contents(); ob_end_clean(); var_dump($cc); ?>