ホームページ  >  記事  >  バックエンド開発  >  PHPのob関数バッファリングメカニズム

PHPのob関数バッファリングメカニズム

墨辰丷
墨辰丷オリジナル
2018-06-07 17:39:431475ブラウズ

この記事では主に紹介していますので、興味のある方は参考にしていただければ幸いです。

バッファリング、つまりバッファに関しては、キャッシュと比較する必要があります。単に定義を比較するだけでは意味がありません。キャッシュは、データを迅速に検索して利用し、CPU 消費量を節約する方法の問題を解決します。一方、バッファリングは、高速 CPU と低速 I/O デバイス間の不一致の問題を解決します。

この記事のもう 1 つの主役である ob 関数について話しましょう。ob 関数は output_buffering の略です。 ob 関数は PHP 拡張関数であるため、ob 関数の主な操作は php バッファ です。

この記事の 2 人の主人公について簡単に説明した後、最初のトピックに戻る必要があります。echo print_r 関数によって出力されたデータはどのようにしてブラウザに到達し、ユーザーに提供されるのか。見る?実際のプロセスは次のとおりです:

コードは次のとおりです:

echo、print_r=>php output_buffering=>webServer buffer=>browser buffer=>browser display

echo 関数と print_r 関数からクライアントへの情報の送信まで、明らかにわかります。私たちは 2 つのバッファを経験しました。クライアントはブラウザのバッファも通過します。この記事で主に説明するのは、php Output_buffering です。

ob 関数を使用しない場合のバッファの使用法

私たちのコードでは ob 関数をまったく使用しないことがよくありますが、バッファは使用されますか?これはphpの設定によって異なります。バッファはphp.iniのoutput_buffering変数を通じて制御されます。デフォルト値はオフですが、バッファを開くにはオンに設定できます。バッファーを呼び出した後は、プログラム内で ob 関数が使用されていない場合でも、コードは実際にバッファーを使用します。さらに、php.ini の Output_buffering の設定に関係なく、cli モードの php はデフォルトで常に閉じられます。

なぜバッファなのでしょうか?簡単に言うと、高速CPUが自分のデータを早めに処理して、それを回線を通じてユーザーに送信したいのですが、回線が狭すぎて一度に送信できません。バッファーが導入されている場合、CPU は生成されたデータをバッファーにすぐに入れて、どこか涼しい場所に置くことができます。バッファは指示に従ってタイムリーにデータを出力します。これにより、高速 CPU と低速 I/O デバイスの間の矛盾が効果的に解決されます。

バッファ内のデータはいつ出力されますか? 1. バッファがいっぱいになると、バッファには容量があり、制限に達するとコンテンツが自動的に出力されます。 2. スクリプトの実行が完了します。多くの小さなプログラムはそれほど多くのコンテンツを出力しません。これは当然のことですが、バッファがいっぱいになるまで待つことはできません。

ob 関数使用時のバッファ使用法

コードは次のとおりです。

 ob_start()

出力バッファをオンにします。この関数は、最も頻繁に呼び出される関数の 1 つです。 Output_buffering が on または x k に設定されている場合、この関数は出力バッファーを開くのではなく、出力バッファーを大きなサイズに拡張します。もちろん、output_buffering が off に設定されている条件では、ob_start がバッファをオープンする役割を果たします。 ob_start() は、オプションのパラメータである Output_callback 関数を渡すこともできます。これについては、公式 PHP マニュアルで詳しく説明されています。

コードは次のとおりです。

ob_get_contents

()

出力バッファの内容を取得するだけで、クリアしません。

コードは次のとおりです:

ob_end_clean()与ob_clean()

これら 2 つの関数の違いは文字通り見ることができます。前者はバッファの内容をクリアして閉じますが、後者はクリア作業のみを行います。これら 2 つの関数を使用した後は、echo や print_r などの以前の関数はコンテンツを出力しなくなることに注意してください。

作者はかつて、print_r を介して ob_get_contents() の内容を出力しようとした後、影響を与えないように ob_clean() を呼び出してバッファをクリアしました。バッファに対する後続の操作が繰り返し失敗しました。よく考えてみると、print_rの内容が再度バッファに書き込まれ、その後にob_clean()という操作が行われるので、当然出力はありません。 ob_clean 操作の前に ob_flush() 関数を呼び出すと、望ましい効果が得られます。

コードは次のとおりです。

ob_flush()与flush()

ob_flush() はバッファの内容を送信し、その内容を破棄します。したがって、この関数の前に ob_get_contents() を使用してバッファの内容を取得するのが最善です。 flash() はサーバー側のバッファをフラッシュしてクライアントに送信します。したがって、プロセスの観点からは、最初に ob_flush() を呼び出し、次にフラッシュ関数を呼び出す必要があります。

さらに、Apache バッファフラッシュ() の動作原理を説明します。 apache モジュール の sapi では、フラッシュは を呼び出すことによって行われます。 sapi_module() のフラッシュ メンバー関数ポインターは、Apache の api::ap_rflush を間接的に使用して、Apache の出力バッファーをリフレッシュします。もちろん、mod_gzip などの他の Apache モジュールは、このアクションの結果を変更し、バッファ自体を出力する可能性があります。その場合、flush() 関数によって生成された結果がクライアントのブラウザにすぐに送信されなくなります。 。

コードは次のとおりです:

ob_get_clean()

ob_get_contents()ob_clean() にすでに習熟している場合、この関数は非常に便利です。単純。それは最初の 2 つを組み合わせたものだからです。主に現在のバッファの内容を取得し、現在の出力バッファを削除します。

ob 関数は他にもたくさんありますが、そのほとんどは比較的簡単に使用でき、理解しやすいものです。詳細な説明があるphpマニュアルを参照してください。この記事では、筆者が最初はよく理解できなかった機能をいくつか挙げています。もちろん、将来的には新たな問題が発生するかもしれません。

要約: 以上がこの記事の全内容です。皆さんの学習に役立つことを願っています。

関連する推奨事項:

php メール送信機能を実装するための smtp メソッド

php は純粋に静的なページメソッド

オブザーバーパターンを実装するための PHP メソッド

以上がPHPのob関数バッファリングメカニズムの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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