ホームページ  >  記事  >  バックエンド開発  >  PHPでのob関数拡張例の詳細説明

PHPでのob関数拡張例の詳細説明

伊谢尔伦
伊谢尔伦オリジナル
2017-06-24 14:35:201514ブラウズ

新しい PHP プログラマにとって、PHP バッファはほぼ透明です。彼らの頭の中では、echo print_r 関数を使えば、データが「シュッ」という音とともにブラウザに飛んで表示されると考えています。私はいつもそうシンプルに考えてきました。 実際、テクノロジーの世界では、物事は常に単純さから複雑さへと進歩してきました。おそらく、テクノロジー開発者も最初はあなたや私と同じように単純でしたが、残酷な現実に直面して、改善するために戦略を調整する必要がありました。最後に、彼らは機械をより効率的にするためのアイデアを考えました。

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

この記事のもう一人の主役である 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 などの以前の関数はコンテンツを出力しなくなることに注意してください。

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

ob_flush()与flush()

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

  另外说明下再Apache buffer flush()的工作原理:在apache module的sapi下,flush会通过调用sapi_module()的flush成员函数指针,间接使用apache的api::ap_rflush刷新apache的输出缓冲区。当然apache其他模块比如mod_gzip可能改变这个动作的结果,可能自己进行输出缓冲区,这将导致flush()函数产生的结果不会立即被送到客户端浏览器。

ob_get_clean()

  如果你已经熟练掌握ob_get_contents()ob_clean(),那这个函数就很简单了。因为它是前两者的结合体。它主要是得到当前缓冲区的内容并删除当前输出缓冲区。

  ob函数还有很多,但大部分用法比较简单,理解较为容易。大家可以参照php手册 ,里面会有详细的解释。本文列出了笔者开始并不是很理解的一些函数,当然今后还会有新的问题出现,想到问题并且解决问题,生活的乐趣也许就在此处吧。

以上がPHPでのob関数拡張例の詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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