phpでのob_flush()とflush()の使い方について
注意: ob_flush() とフラッシュ() の 2 つの関数は、通常、最初に ob_flush()、次にフラッシュ() という順序で使用されます。
ここでは、リフレッシュ バッファーを使用するタイミングと、バッファーをリフレッシュする理由について詳しく説明します。
1. バッファを更新するタイミング
2 つの関数 file_get_contents() と file_put_contens() がプログラムで使用される場合、またはプログラムが同様の「読み取りおよび書き込み」関数を実行するか、ブラウザーへの出力操作を実行する場合、ob_flush() と flash() が使用されます。バッファー。
2. バッファをリフレッシュする理由
file_get_contents() と file_put_content() を例として説明します。
2 つの関数 file_get_contents() と file_put_conents() は、それぞれデータの読み取り操作と書き込み操作を実行します。これは、読み取り速度が書き込み速度よりも速いためです。データが読み取られても、データが書き込まれたことを意味するわけではありません。実際には、読み取られた内容はバッファ (メモリ) に置かれることになります。非常に速いアクション。
また、(プログラムがブラウザーへの出力操作を実行するとき) と説明しましたが、個々の Web サーバー プログラム、特に Win32 での Web サーバー プログラムは、結果をブラウザーに送信する前に、プログラムの終了までスクリプトの出力をキャッシュします。 。プログラムを実行後にのみブラウザに出力したくない場合は、ob_flush() と flash() を使用してキャッシュを更新することもできます。
実際、flush() には別の用途があります。それは、プログラムが終了する前に出力することです。つまり、ループが終了する前に結果の一部をブラウザーに出力できます。この効果は、ajax の非同期送信効果と非常によく似ています。 。
ob_flush と flash の違いを詳しく理解してください
マニュアルの ob_flush/flush の説明では、両方とも出力バッファをリフレッシュし、一緒に使用する必要があるため、多くの人に混乱を引き起こすでしょう...
実際には、両者の動作はオブジェクトが異なります。場合によっては、flush は何も実行しません。
ob_* シリーズの関数は、PHP 自体の出力バッファを操作します
そこで、ob_flush はバッファを更新します。
そして厳密に言えば、これは PHP が Apache のモジュール (ハンドラーまたはフィルター) としてインストールされている場合にのみ実際に効果を持ちます (特に Apache を参照すると考えられます)。
Apache モジュールの sapi の下で、flush は sapi_module のフラッシュ メンバー関数ポインターを呼び出すことで間接的に Apache の API を呼び出します。 ap_rflush は Apache の出力バッファーを更新します もちろん、マニュアルには、変更される可能性のある Apache の他のモジュールもあると記載されています。このアクションの結果。
mod_gzip などの一部の Apache モジュールは、独自の出力をキャッシュする場合があり、そのため、flush() 関数によって生成された結果がクライアントのブラウザーにすぐに送信されなくなります。
ブラウザでも、受信したコンテンツを表示する前にキャッシュします。たとえば、Netscape ブラウザは改行または HTML タグの先頭を受け取るまでコンテンツをキャッシュし、 タグを受け取るまでテーブル全体を表示しません。
Microsoft Internet Explorer の一部のバージョンは、256 バイトを受信した後にのみページの表示を開始するため、これらのブラウザーがページのコンテンツを表示できるようにするには、いくつかの追加のスペースを送信する必要があります。したがって、最初に ob_flush を使用するのが正しい順序です。 、その後、フラッシュします
もちろん、他の sapi ではフラッシュを呼び出すことはできませんが、コードの移植性を確保するために、フラッシュを併用することをお勧めします