ホームページ  >  記事  >  バックエンド開発  >  PHPはリフレッシュバッファ関数の使い方を深く理解しています

PHPはリフレッシュバッファ関数の使い方を深く理解しています

伊谢尔伦
伊谢尔伦オリジナル
2018-05-24 16:26:353687ブラウズ

PHPでのob_flush()とflush()の使用方法について

注: 2つの関数ob_flush()とflush()は通常、最初にob_flush()、次に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() には別の用途があります。それは、プログラムが終了する前に出力することです。つまり、この効果は、ループが終了する前にブラウザに出力することができます。アヤックス。
ob_flushとflushの違いについての深い理解
マニュアルのob_flush/flushの説明では、両方とも出力バッファをリフレッシュし、一緒に使用する必要があるため、多くの人に混乱を引き起こす可能性があります...
実際、それらは異なるオブジェクトに対して動作する場合があります。
ob_* シリーズ関数は PHP 自体の出力バッファを動作させます。
厳密に言えば、ob_flush はこれを更新します。 PHP が Apache モジュール (ハンドラーまたはフィルター) としてインストールされている場合にのみ使用できます。これは、Apache の sapi の下で Web サーバーのバッファーを更新します。 module、flush は sapi_module メンバー
関数ポインター
のフラッシュを呼び出し、間接的に Apache の API を呼び出します。 ap_rflush は Apache の出力バッファを更新します もちろん、マニュアルには、このアクションの結果を変更する可能性のある他の A​​pache モジュールもあるとも記載されています。 一部の Apache モジュール、たとえば mod_gzip は出力キャッシュを単独で実行する場合があり、これにより、flush() 関数によって生成された結果がクライアントのブラウザにすぐに送信されなくなります。 ブラウザでも、受信したコンテンツを表示する前にキャッシュします。たとえば、Netscape ブラウザは改行または HTML タグの先頭を受け取るまでコンテンツをキャッシュし、 タグを受け取るまでテーブル全体を表示しません。
Microsoft Internet Explorer の一部のバージョンでは、256 バイトを受信した後にのみページの表示が開始されるため、これらのブラウザーにページのコンテンツを表示させるには、いくつかの追加のスペースを送信する必要があります。したがって、最初に ob_flush を使用する正しい順序は次のとおりです。その後フラッシュします
もちろん、他の SAPI ではフラッシュを呼び出すことはできませんが、コードの移植性を確保するために、フラッシュを併用することをお勧めします。

buffer ---- flash()

バッファはメモリのアドレス空間で、Linux システムのデフォルトのサイズは通常 4096 (1kb) で、これは 1 つのメモリ ページです。主に、速度が同期していないデバイスや優先度が異なるデバイス間のデータ転送領域を格納するために使用されます。バッファーを介して、プロセスは相互に待機する時間を減らすことができます。次に、より一般的な例を示します。ファイルを編集するためにテキスト エディタを開いた場合、文字を入力するたびに、オペレーティング システムはその文字をすぐにディスクに直接書き込むのではなく、書き込み時に最初にその文字をバッファに書き込みます。バッファがいっぱいの場合、バッファ内のデータはディスクに書き込まれます。もちろん、カーネル関数 flash() が呼び出されるときは、バッファ内のダーティ データをディスクに書き戻す必要があります。
同様に、echo と print が実行されると、出力は表示のために tcp 経由でクライアントのブラウザにすぐに送信されませんが、データは php バッファーに書き込まれます。 phpのoutput_bufferingメカニズムは、tcpバッファの前に新しいキューが確立され、データがそのキューを通過する必要があることを意味します。 PHP バッファーがいっぱいになると、スクリプト プロセスは PHP バッファー内の出力データをシステム カーネルに渡し、表示のために TCP 経由でブラウザーに渡します。したがって、データは、echo/pring -> php バッファ -> tcp バッファ -> ブラウザ
php out_buffering --- ob_flush()
デフォルトでは、php バッファがオンになっています。このバッファのデフォルト値は 4096、つまり 1kb です。 Output_buffering 設定は php.ini 設定ファイルで見つけることができます echo、print などでユーザーデータを出力すると、output_buffering がいっぱいになるまで、出力データはブラウザの表示に送信されます。 。 ob_start() を介して php の出力バッファリングメカニズムを手動でアクティブにすることもできます。これにより、出力が 1kb のデータを超えた場合でも、データは実際には tcp に渡されず、ブラウザーに渡されます。 バッファスペースは十分な大きさに設定されています。スクリプトが終了するか、ob_end_flush 関数が呼び出されるまで、データはクライアント ブラウザに送信されません。

おそらく多くの人にとって、これら 2 つの機能の使用法が最も混乱する問題です。マニュアルの 2 つの機能の説明も明確ではなく、両方の機能の違いが明確に指摘されていないようです。出力キャッシュを更新します。しかし、記事の冒頭のコードで、flush() が ob_flush() に置き換えられると、プログラムは正しく実行されなくなります。明らかに、それらの間に違いがあります。そうでない場合は、それらの一方が別の関数のエイリアスであることをマニュアルに直接記載するだけで十分です。それらを個別に説明する必要はありません。それでは、それらの違いは何でしょうか?

キャッシュが有効になっていない場合、スクリプトによって出力されたコンテンツはサーバー側で
出力待ち状態になり、flush()は出力待ちのコンテンツをすぐにクライアントに送信できます。

キャッシュがオンになった後、

スクリプトによって出力されたコンテンツは出力キャッシュに保存されます。この時点で、flush()を直接使用した場合、コンテンツは送信されません。クライアントに。 ob_flush() の機能は、元々出力キャッシュに格納されていたコンテンツを取り出して出力待機状態に設定することですが、この場合、最初に ob_flush() を使用する必要があります。その後、 flash() を実行すると、クライアントはスクリプトの出力をすぐに取得できます。

1. フラッシュと ob_flush の正しい順序は、次のように最初に ob_flush、次にフラッシュです:
ob_flush();
flush();
Web サーバーのオペレーティング システムが Windows システムの場合の場合、順序が逆になるか、ob_flush() が使用されなくても問題は発生しません。 [要検証] ただし、Linux システムでは出力バッファを更新できません。
出力バッファリング関数
1.bool ob_start ([ callback $output_callback [, int $chunk_size [, bool $erase ]]] )
output_buffering メカニズムをアクティブにします。アクティブ化すると、スクリプト出力はブラウザに直接送信されなくなり、一時的に PHP バッファ メモリ領域に書き込まれます。
phpはデフォルトでoutput_bufferingメカニズムを有効にしますが、ob_start()関数を呼び出すことにより、データのoutput_buffering値が十分に大きな値に拡張されます。 $chunk_size を指定して、output_buffering の値を指定することもできます。 $chunk_size のデフォルト値は 0 です。これは、スクリプトが終了するまで php バッファー内のデータがブラウザーに送信されないことを意味します。 $chunk_size のサイズを設定すると、バッファ内のデータ長がこの値に達する限り、バッファ内のデータがブラウザに送信されることを意味します。
もちろん$ouput_callbackを指定することでバッファ内のデータを処理することもできます。たとえば、関数 ob_gzhandler はバッファ内のデータを圧縮してブラウザに送信します。
3 番目のパラメータ: キャッシュをクリアするかどうか。オプション。デフォルトは true です。false に設定すると、スクリプトの実行が終了する前にキャッシュはクリアされません。
2.ob_g​​et_contents
PHPバッファ内のデータのコピーを取得します。 ob_end_clean() 関数が呼び出される前にこの関数を呼び出す必要があることに注意してください。そうしないと、ob_get_contents() は null 文字を返します。
ob_get_contents() を使用して、サーバー側のキャッシュされたデータを文字列形式で取得できます。
ob_end_flush() を使用して、キャッシュされたデータを出力し、キャッシュを閉じます。
ob_end_clean() を使用すると、データやその他のアクションを行わずに、サーバーにキャッシュされたデータがサイレントに消去されます。
サーバー側のキャッシュはスタックされています。つまり、ob_start() を有効にした後、それを閉じる前に、その中にある別のキャッシュ ob_start() を開くことができます。
ただし、キャッシュをオフにする操作の数が、キャッシュをオンにする操作の数と同じであることも確認する必要があります。
ob_start() は、キャッシュ データ を処理するための コールバック関数 を指定できます。1 つの ob_start() が別の ob_start() 内にネストされている場合、外側の ob_start() の番号は A であり、内側の層はob_start() の番号は B です。それぞれに functionA と functionB というコールバック関数があります。B のデータがキャッシュされて出力されると、最初に funcitonB コールバック関数によって処理され、次に外側の functionA コールバック関数に渡されます。処理のためにそれをクライアントに出力できます。さらに、マニュアルには、Apache などの一部の Web サーバーでは、コールバック関数を使用すると、プログラムの現在の作業ディレクトリが変更される可能性があると記載されています。解決策は、コールバック関数で作業ディレクトリを手動で変更し、chdir 関数を使用することです。 . これは滅多に遭遇しないようなので、遭遇した際は忘れずにマニュアルを確認してください。

3. ob_end_flush と ob_end_clean
これら 2 つの関数は似ており、両方とも ouptu_buffering メカニズムをオフにします。ただし、違いは、ob_end_flush は php バッファー内のデータをクライアント ブラウザーにフラッシュ (フラッシュ/送信) するだけですが、ob_clean_clean は php バッファー内のデータをクリア (消去) しますが、クライアント ブラウザーには送信しないことです。

ob_end_flush が呼び出される前、PHP バッファー内のデータはまだ存在しており、ob_get_contents() は引き続き PHP バッファー内のデータのコピーを取得できます。

ob_end_flush() を呼び出した後、 ob_get_contents() は空の文字列を取得し、ブラウザは出力を受け取ることができません。つまり、出力はありません。

ob_get_contents() を使用してサーバー側のキャッシュされたデータを文字列の形式で取得し、 ob_end_flush() を使用してキャッシュされたデータを出力し、キャッシュを閉じることができます。

ob_end_clean() を使用すると、データやその他のアクションを行わずに、サーバーにキャッシュされたデータがサイレントに消去されます。

以上がPHPはリフレッシュバッファ関数の使い方を深く理解していますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。