PEAR を使用した PHP プログラムのバッファー
バッファリングは PHP の世界では注目のトピックです。これは、PHP によって生成される動的ページは、リクエストの結果が同じであるかどうかに関係なく、ユーザーがリクエストするたびに再計算する必要があるためです。このような過負荷は、トラフィックの多い 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 バッファーに現在含まれているコンテナーとそれぞれのパラメーターです。
ファイル — ファイル コンテナーは、バッファリングされたデータをファイル システムに保存し、最も高速なコンテナーです。
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 コンテナはデータベース抽象化レイヤーを使用してバッファを保存します。
データベースクラス
データベースファイル
データベースパス
ローカルファイル
ローカルパス
ext/dbx - PHP のデータベース抽象化レイヤー拡張機能。データベースにバッファーを保存する場合は、このコンテナーを使用できます。
モジュール
ホスト
データベース
ユーザー名
パスワード
キャッシュテーブル
持続的
PEAR キャッシュを使用することで得られるパフォーマンスの向上は、選択したバッファ コンテナによって異なります。たとえば、データベースの結果をデータベース キャッシュに再度保存することは意味がありません。
PEAR Cache の関数バッファ モジュールは、PHP の組み込み関数であっても、ユーザー定義関数であっても、あらゆる関数やメソッドの結果をバッファリングできます。デフォルトでファイル コンテナを使用し、バッファリングされたデータを function_cache というディレクトリに置きます。
Cache_Function クラスのコンストラクターには、次の 3 つのオプションのパラメーターを指定できます。
$container: バッファ コンテナの名前。
$container_options: バッファコンテナの配列パラメータ。
$expires: バッファ オブジェクトの有効期限が切れる時間 (秒単位)。
通常の関数呼び出しで Cache_Function クラスの call() メソッドを使用すると、バッファリングをトリガーできます。 call() の呼び出しは簡単です。1 つの引数は関数の名前、次に関数の引数、2 番目の引数は呼び出される最初の関数というようになります。例を見てみましょう。
例 1 バッファ関数とメソッドの呼び出し
//PEAR キャッシュの関数バッファを呼び出します。
require_once 'キャッシュ/関数.php';
// いくつかのクラスと関数を定義します。
クラス foo {
関数バー($test) {
エコー「foo::bar($test)」
";
}
}
クラスバー{
関数 foobar($object) {
echo '$'.$object.'->foobar('.$object.')
';
}
}
$bar = 新しいバー;
関数 foobar() {
エコー 'foobar()';
}
// Cache_Function オブジェクトを取得します
$cache = 新しいキャッシュ関数();
// クラス foo の静的関数 bar() をバッファリングします (foo::bar())。
$cache->call('foo::bar', 'test');
// $bar->foobar()
$cache->call('bar->foobar', 'bar');
$cache->call('foobar');
?>
以下では、Cache_Output を使用して出力をバッファリングします。
例 2 スクリプト出力のバッファリング
//PEAR キャッシュの出力バッファをロードします
require_once 'キャッシュ/Output.php';
$cache = new Cache_Output('file', array('cache_dir' => '.') );
// バッファリングされるページのマークを計算します。ページのバッファリングは次のものに依存すると仮定します。
// URL、HTTP GET 変数、POST 変数、Cookie。
$cache_id = $cache->generateID(
array('url' => $REQUEST_URI, '
post' => $HTTP_POST_VARS, 'cookie' => $HTTP_COOKIE_VARS) );
// クエリバッファ
if ($content = $cache->start($cache_id)) {
//バッファヒット
$content をエコーします。
死ぬ();
}
//バッファが失われました
// -- ここにコンテンツを挿入してコードを生成します --
// ページをバッファに保存します
echo $cache->end();
?>
Cache_Output クラスを使用すると、動的データベース駆動の Web サイト アプリケーションを静的な Web サイト アプリケーションに簡単に変換できるため、サイトのパフォーマンスが大幅に向上します。 GZIP を使用して HTML コンテンツを圧縮するサイトが増えています。これにより、サーバーの帯域幅消費が削減され、モデムを使用してインターネットにアクセスするユーザーにとっても大きなメリットが得られます。
Cache_OutputCompression は、Cache_Output クラスの機能を拡張し、GZIP 圧縮された HTML コンテンツをバッファリングして、CPU 圧縮時間を節約します。