PEAR::Cache_Lite は小さなキャッシュシステムです。 高トラフィックな Web サイト向けに最適化されていますので、本当に高速でかつ安全です (これはファイルロックや対汚染のテストを行うためです)。
メモ : Cache_Lite の独立した中国語ドキュメントは このページ で利用できます。
とりわけ、PEAR::Cache_Lite は非常に高速である必要があります。 これはハイレベルなハードウェアソリューションでダウンしない高トラフィックな サイトでの PEAR 利用の可能性を与えます。
cache_lite の技術的な選択についての詳細は、 このドキュメント にあります。 しかし、エラーが発生した場合 (非常に稀です) の主となるアイデア だけは、PEAR.php ファイルに含まれています。
キャッシュシステムはしばしばアプリケーションレイヤに埋め込まれるので、 PEAR::Cache_Lite のカーネルは小さく、 かつ適用するライセンスについて融通が利く必要があります (LGPL)。 高度な機能性はコアを拡張するファイルに見ることができます。
高トラフィックな Web サイトでは、 キャッシュシステムはキャッシュファイルの汚染から保護する必要があります (同時に読み書きモードでアクセスするためです)。 ほとんどのキャッシュシステムでは、 この問題に対する保護機能が提供されていません。
ファイルのロックは完全な解決法ではありません。 NFSやマルチスレッドサーバでは役に立たないからです。 そのため、PEAR::Cache_Lite ではこれに加えてあらゆる状況におけるデータ保全を保証するために 2つのメカニズム (ハッシュキーに基づく) を提供しています。 詳細は前の段落にあるリンクを参照してください。
Cache_Lite の全てのモジュールは同じ考え方に従っています。
パラメータ (デフォルトではない他の値) は連想配列を使って コンストラクタに渡されます。
キャッシュファイルはキャッシュID (と最後にはグループ) によって識別されます。柔軟性を持たせるため、 ID のロジックは開発者が選択することができます。
これ以降「グループ」はキャッシュファイルを貯めたもの、 「ブロック」は HTML ページの一部という意味で使用します。
簡単な例から始めましょう : とある一意な変数 (文字列) をもってページが生成され、復元されます。
<?php
// パッケージを include する
require_once('Cache/Lite.php');
// このキャッシュのIDを設定する
$id = '123';
// いくつかのオプションを設定する
$options = array(
'cacheDir' => '/tmp/',
'lifeTime' => 3600
);
// Cache_Lite オブジェクトを生成する
$Cache_Lite = new Cache_Lite($options);
// このIDに対する有効なキャッシュがあるかどうかテストする
if ($data = $Cache_Lite->get($id)) {
// キャッシュがヒットした !
// コンテンツは $data に入っている
// (...)
} else { // 有効なキャッシュが見つからなかった (このページを生成する必要がある)
// キャッシュミス !
// キャッシュに入れるデータを $data に入れる
// (...)
$Cache_Lite->save($data);
}
?>
もしブロック毎のキャッシュを使用したいがグローバルキャッシュにしたくない場合、次のようなスクリプトになります:
<?php
require_once('Cache/Lite.php');
$options = array(
'cacheDir' => '/tmp/',
'lifeTime' => 3600
);
// Cache_Lite オブジェクトを生成する
$Cache_Lite = new Cache_Lite($options);
if ($data = $Cache_Lite->get('block1')) {
echo($data);
} else {
$data = 'Data of the block 1';
$Cache_Lite->save($data);
}
echo('<br><br>Non cached line !<br><br>');
if ($data = $Cache_Lite->get('block2')) {
echo($data);
} else {
$data = 'Data of the block 2';
$Cache_Lite->save($data);
}
?>
しかしながら、単一文字変数で全てのページコンテンツを復元することは常に可能ではありません。Cache_Lite_Output は、このようにして私たちの助けになります :
<?php
require_once('Cache/Lite/Output.php');
$options = array(
'cacheDir' => '/tmp/',
'lifeTime' => 10
);
$cache = new Cache_Lite_Output($options);
if (!($cache->start('123'))) {
// Cache missed...
for($i=0;$i<1000;$i++) { // Making of the page...
echo('0123456789');
}
$cache->end();
}
?>
この考えは、ブロック毎のキャッシュの使用法と同じです :
<?php
require_once('Cache/Lite/Output.php');
$options = array(
'cacheDir' => '/tmp/',
'lifeTime' => 10
);
$cache = new Cache_Lite_Output($options);
if (!($cache->start('block1'))) {
// キャッシュミス ...
echo('Data of the block 1 !');
$cache->end();
}
echo('Non cached line !');
if (!($cache->start('block2'))) {
// キャッシュミス ...
echo('Data of the block 2 !');
$cache->end();
}
?>
Cache_Lite を使って最大限の効果を得るためには、 ページが必要とする全てのパッケージを機械的に include しないでください。 条件付きの include を使用していることでページがキャッシュされていない (そして、再計算しなければならない) 場合、必要なモジュール だけ をロードするようにしてください。
良くない 方法 :
<?php
require_once("Cache/Lite.php");
require_once("...")
require_once("...")
// (...)
$cache = new Cache_Lite();
if ($data = $Cache_Lite->get($id)) { // キャッシュがヒットした !
echo($data);
} else { // $data にページデータを(再)構築する必要がある
// (...)
$Cache_Lite->save($data);
}
?>
こちらはよい方法です (通常2倍早くなります) 。
<?php
require_once("Cache/Lite.php");
// (...)
$cache = new Cache_Lite();
if ($data = $Cache_Lite->get($id)) { // キャッシュがヒットした !
echo($data);
} else { // $data にページデータを(再)構築する必要がある
require_once("...")
require_once("...")
// (...)
$Cache_Lite->save($data);
}
?>
Cache_Lite をもっと知りたいなら、 パッケージに付属している例と技術的な詳細を参照してください。