Smartyキャッシュ
2015年03月04日 22:26
目的
高速化!
特にDBをバリバリ使っていると効果あり。
書き方
ざっくり書くと以下のようになります。
ちょっと抽象的なコードになりますがご了承ください。
Smartyのバージョンは3です。
一部説明を端折っているのでSmartyマニュアルも合わせて読んでいただければ。
// 初期設定
$smarty = new Smarty();
$smarty->caching = Smarty::CACHING_LIFETIME_CURRENT;
$smarty->cache_lifetime = 3600; // 単位は"秒"
/* ---------------------
その他の設定は割愛
--------------------- */
$template = 'hoge.html';
$cache_id = 'cache_hoge';
if(!$smarty->isCached($template, $cache_id)){
// DBなどからデータを取得、テンプレート変数設定などの処理を行う。
// キャッシュが残っている場合はスキップする。
}
// 出力
$smarty->display($template, $cache_id);
キャッシュIDの設定
キャッシュIDは無しでも動きますが、設定したほうがいいと思います。
$cache_id = 'cache_hoge';
キャッシュIDは上手く設定すると動的ページでも対応できるようになります。
下記のように引数に応じて一意のIDを持ったキャッシュを生成してくれます。
$cat = $_GET['category'];
$id = (int)$_GET['id'];
$cache_id = sprintf('cache_%s-%d', $cat, $id);
例えば、ブログではエントリーごとにキャッシュを生成できます。
キャッシュを確認して処理を減らす
isCached() でキャッシュの有無を確認します。
マニュアルによると、
isCached() が TRUE を返すと、実際にはキャッシュされた出力が読み込まれ、内部に格納されます。
とあり、この時点でキャッシュからの出力が確定します。
キャッシュからの出力が確定した後にテンプレート変数をいくら設定しても意味がありません。 つまり、DBなどからデータを取得するといった処理が不要になり、ページ表示の高速化を図ることができるわけです。
if(!smarty->isCached($template, $cache_id)){
// DBなどからデータを取得、テンプレート変数設定などの処理を行う。
// ** キャッシュが残っている場合はスキップする。
}
// 出力
$smarty->display($template, $cache_id);
注意点
$cache_lifetime に設定された時間を過ぎない限り、キャッシュ内容を表示し続けます。
CMS等を使ってキャッシュの効いているページを更新した場合、その都度キャッシュを削除しなければなりません。