PEAR を使用した PHP プログラムのバッファリング
バッファリングは、PHP の世界でホットなトピックです。PHP によって生成された動的ページは、リクエストの結果が同じかどうかに関係なく、ユーザーがリクエストするたびに再計算する必要があるためです。同時に、PHP スクリプトは毎回 1 回コンパイルされます。このような過負荷は、トラフィックの多い Web サイトでは確かに耐えられないでしょう。幸いなことに、Web の結果はスクリプトを再実行してコンパイルすることなくキャッシュできます。ZendCache やオープン ソースの Alternate PHP Cache などの商用製品は、PHP スクリプトをバイト コードにコンパイルしてキャッシュする方法を提供します。
PEAR のバッファリング パッケージは、動的コンテンツ、データベース クエリ、および PHP 関数呼び出しをバッファリングするためのフレームワークを提供します。
Perl に CPAN があり、TeX に CTAN があるのと同じように、PHP にもクラス、ライブラリ、モジュールを保存するための独自の中央リソース ライブラリがあります。このライブラリは PEAR (PHP Extension and Add-On Repository) と呼ばれます。
この記事は、PEAR 環境がインストールされていることを前提としています。インストールされていない場合は、PHP Web サイトからダウンロードできます。 PEAR のバッファ パッケージには、全体的なバッファ クラスといくつかの特殊なサブクラスが含まれています。バッファ クラスはコンテナ クラスを使用して、バッファされたデータを保存および管理します。
現在 PEAR バッファーに含まれているコンテナーとそれぞれのパラメーターは次のとおりです:
file -- ファイル コンテナーはバッファリングされたデータをファイル システムに保存し、最も高速なコンテナーです。
cache_dir -- これはコンテナがファイルを保存するディレクトリです。
filename_prefix -- キャッシュ ファイルのプレフィックス (例: "cache_")。
shm -- shm コンテナは、バッファリングされたデータを共有メモリに置きます。ベンチマーク テストでは、現在の実装では、このコンテナがファイル コンテナよりも遅いことが示されています。
shm_key -- 共有メモリで使用されるキーの値。
shm_perm -- 共有メモリ データ セグメントを使用する許可。
shm_size -- 割り当てられた共有メモリのサイズ。
sem_key -- セマフォのキー値。
sem_perm -- セマフォの権限。
db -- PEAR のデータベース抽象化レイヤー。
dsn -- データベース接続の DSN。 PEAR の DB ドキュメントを参照してください。
cache_table -- テーブルの名前。
phplib -- phplib コンテナはデータベース抽象化レイヤーを使用してバッファを保存します。
db_class
db_file
db_path
local_file
local_path
ext/dbx -- PHP のデータベース抽象化レイヤー拡張機能。データベースにバッファーを保存したい場合は、このコンテナーを使用できます。
module
host
db
username
password
cache_table
persistent
PEAR Cache を使用することによって得られるパフォーマンスの向上は、選択したバッファ コンテナーによって異なります。たとえば、データベースの結果をデータベース キャッシュに再度保存することは意味がありません。
PEAR Cache の関数バッファ モジュールは、PHP の組み込み関数であっても、ユーザー定義関数であっても、あらゆる関数やメソッドの結果をバッファリングできます。デフォルトでファイル コンテナを使用し、バッファリングされたデータを function_cache というディレクトリに置きます。
Cache_Function クラスのコンストラクターには、3 つのオプションのパラメーターを指定できます:
$container: バッファー コンテナーの名前。
$container_options: バッファコンテナの配列パラメータ。
$expires: バッファ オブジェクトの有効期限が切れる時間 (秒単位)。
通常の関数呼び出しで Cache_Function クラスの call() メソッドを使用すると、バッファリングをトリガーできます。 call() の呼び出しは簡単です。1 つのパラメータは関数の名前、次に関数のパラメータ、2 番目のパラメータは呼び出される関数の最初のパラメータ、というようになります。例を見てみましょう:
Example 1 関数とメソッドの呼び出しをバッファーします
// 调用 PEAR Cache 的函数缓冲。<br><?php <br>require_once 'Cache/Function.php';<br>// 定义一些类和函数。<br>class foo {<br>function bar($test) {<br>echo "foo::bar($test)<br>";<br>}<br>}<br>class bar {<br>function foobar($object) {<br>echo '$'.$object.'->foobar('.$object.')<br>';<br>}<br>}<br>$bar = new bar;<br>function foobar() {<br>echo 'foobar()';<br>}<br>// 取得 Cache_Function 对象<br>$cache = new Cache_Function();<br>// 对 foo 类的静态函数 bar() 作缓冲(foo::bar())。<br>$cache->call('foo::bar', 'test');<br>// $bar->foobar() <br>$cache->call('bar->foobar', 'bar');<br>$cache->call('foobar');<br>?><br> |
// 加载 PEAR Cache 的输出缓冲<br><?php <br>require_once 'Cache/Output.php';<br>$cache = new Cache_Output('file', array('cache_dir' => '.') );<br>// 计算要缓冲页面的标记,我们假定页面的缓冲取决于<br>// URL, HTTP GET 和 POST 变量以及 cookies。<br>$cache_id = $cache->generateID(<br>array('url' => $REQUEST_URI, '<br>post' => $HTTP_POST_VARS, 'cookies' => $HTTP_COOKIE_VARS) );<br>// 查询缓冲<br>if ($content = $cache->start($cache_id)) {<br>// 缓冲命中<br>echo $content;<br>die();<br>}<br>// 缓冲丢失<br>// -- 在这里插入内容产生代码 --<br>// 把页面存入缓冲<br>echo $cache->end();<br>?> |
使用中Cache_Output クラスを使用すると、動的データベース駆動の Web サイト アプリケーションを静的な Web サイト アプリケーションに簡単に変換できるため、サイトのパフォーマンスが大幅に向上します。 GZIP を使用して HTML コンテンツを圧縮するサイトが増えています。これにより、サーバーの帯域幅消費が削減され、モデムを使用してインターネットにアクセスするユーザーにとっても大きなメリットが得られます。
Cache_OutputCompression は、Cache_Output クラスの機能を拡張し、GZIP 圧縮された HTML コンテンツをバッファリングして、CPU 圧縮時間を節約します。
編集者のおすすめ: