キャッシュが有効な理由
PHP を使用して動的にページを生成すると、
多かれ少なかれ、生成に時間がかかったり、
サーバの処理能力に負荷をかけることになります。
そこで、生成したページを一時的に保存(キャッシュ)して
再利用することを考えます。
たとえば、すべてのユーザに
まったく同じ内容のページを表示する場合、
100 人のユーザがいたら、
100 回同じページを生成するのは無駄です。
初めに生成したページをキャッシュしておき、
残りのユーザにはキャッシュしたページを表示します。
これにより、100 回していたページの生成処理が
1 回で済むため、かなりの効率化が図れます。
キャッシュを有効に活用することで、
体感速度とサーバへの負荷は大きく改善されます。
キャッシュ機能を使用する
キャッシュ機能を使用する場合は、
まず、キャッシュの動作パラメータを設定します。
$ramp->setCache(cache_dir);
$ramp->setCache(cache_dir, lifetime);
cache_dir はキャッシュファイルを保存するディレクトリです。
キャッシュファイルは普通のテキストファイルとして作成されるので、
それを保管するのに適当なディレクトリを用意して下さい。
その際、プログラムがファイルを作成できるよう、
パーミッションを設定することをお忘れなく。
lifetime は、生成されたキャッシュの有効時間です。
秒数で指定して下さい。
有効時間が過ぎたキャッシュは無効となり、使用されません。
lifetime を省略すると、
キャッシュは明示的に削除されない限り有効となります。
キャッシュする
setCache でキャッシュの設定を終えたら、
saveCache を使ってキャッシュします。
$ramp->saveCache(string, id);
string に指定した文字列がキャッシュされます。
$ramp->saveCache(string, id, group);
id には、キャッシュを識別するための ID 情報を指定します。
group は、ID 情報をグループ化する際に指定します。
group は省略可能で、省略すると "default" が指定されます。
キャッシュを取得する
saveCache を使ってキャッシュしたデータは
getCache で取得することができます。
$ramp->getCache(id);
id と group は、saveCache で使用したものを指定します。
$ramp->getCache(id, group);
指定した id と group に対応するキャッシュデータがあれば
それを返します。
ただし、キャッシュデータが存在しても、
setCache で設定された有効時間が過ぎている場合は
キャッシュデータは無効となり、取得できません。
文字列をキャッシュする
キャッシュの使用例を示します。
// キャッシュディレクトリを "./cache_dir/"
// キャッシュの有効時間を60秒に設定。
$ramp->setCache("./cache_dir/", 60);
// キャッシュの id と group を次のように設定。
// 一例として、id にユーザID、
// group にキャッシュするページIDを割り当てる。
$id = $ramp->get("user_id");
$group = "info_page";
// キャッシュデータを取得。
$cache = $ramp->getCache($id, $group);
// キャッシュデータが有効かどうかを調べる。
if ($cache === false) {
// キャッシュデータが無効なので、
// ページを生成するための処理を行う。
// つまり、キャッシュが有効なら、
// このブロックの処理を省略できる。
// ページを生成するための処理が終わったら、
// ページを文字列として生成。
$cache = $ramp->fetch("info_page.html");
// キャッシュする。
$ramp->saveCache($cache, $id, $group);
}
// ページを出力。
echo $cache;
この例では、info_page.html のキャッシュが
ユーザ($id)ごとに生成されます。
生成されたキャッシュは 60 秒間有効ですので、
同じユーザが 60 秒以内に再度アクセスしてきた場合には
キャッシュが使用され、
ページを生成するための処理が省略されます。
出力をキャッシュする
saveCache を使ったキャッシュでは、基本的に、
キャッシュしたいデータを一旦変数に格納して使用します。
そのため、巨大なページを
丸々キャッシュしたい場合などには不便です。
そのような場合には以下のメソッドを使用します。
$ramp->startOutputCache(id);
$ramp->startOutputCache(id, group);
$ramp->endOutputCache();
startOutputCache を実行した後、
endOutputCache が実行されるまでに出力されたデータが
すべてキャッシュされます。
有効なキャッシュがある場合は、
startOutputCache はそれを出力し、false を返します。
id と group は saveCache と同様です。
// キャッシュディレクトリを "./cache_dir/"
// キャッシュの有効時間を 60 秒に設定。
$ramp->setCache("./cache_dir/", 60);
// キャッシュの id と group を次のように設定。
// 一例として、id にユーザ ID、
// group にキャッシュするページ ID を割り当てる。
$id = $ramp->get("user_id");
$group = "info_page";
// 出力キャッシュモードを開始する。
// もし、有効なキャッシュがある場合は、
// startOutputCache はただちにそれを出力して
// false を返す。
if ( $ramp->startOutputCache($id, $group) ) {
// startOutputCache が true を返したということは、
// 有効なキャッシュが存在しないので、
// 出力キャッシュモードが ON になったということ。
// ページを生成するための処理を行い、
// 結果を出力する
$ramp->display("info_page.html");
// ちなみに、キャッシュされるのは
// display メソッドに限らず、
// 普通の出力もキャッシュされる。
echo "キャッシュされる。";
// endOutputCache が実行された時点で、
// startOutputCache ~ endOutputCache の出力が
// キャッシュとして保存される。
$ramp->endOutputCache();
// endOutputCache のあとの出力は
// キャッシュされない。
echo "キャッシュされない。";
}
startOutputCache は
キャッシュが有効でない場合に true を返す点にご注意ください。
startOutputCache でキャッシュされたデータも
saveCache でキャッシュされたデータと同様、
getCache で取得できます。
補足
Rampart のキャッシュ機能は
PEAR の Cache_Lite を使って実装されています。
キャッシュ機能を使用するには、ご利用の Web サーバに
Cache_Lite がインストールされている必要があります。