Smartyキャッシュ

目的

高速化!
特に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等を使ってキャッシュの効いているページを更新した場合、その都度キャッシュを削除しなければなりません。

参考文献

スポンサードリンク