第15章 キャッシュ

目次

キャッシュのセットアップ
ページごとに複数のキャッシュ
キャッシュのグループ
出力のキャッシュ可能性の制御
テンプレートセクションのキャッシュ可能性
タグのキャッシュ可能性
変数のキャッシュ可能性
プラグインのキャッシュ可能性
Custom Cache Implementation

キャッシュは出力内容をファイルに保存する事によって、 display() 又は fetch() を呼び出す速度を向上させるために使用されます。キャッシュが有効の場合、 出力を再生成せずに表示されます。特に処理時間が長いテンプレートは、 キャッシュを使用する事で大きく速度が上昇するでしょう。 キャッシュされるのは display() 又は fetch() の出力結果なので、1つのキャッシュファイルが複数のテンプレートファイルや 設定ファイル等で構成されていることもあります。

テンプレートが動的コンテンツの場合、何をどれくらいの期間キャッシュするのか注意が必要です。 例えば、Webサイトの一面にそれほど変更されないコンテンツが表示されている場合は、 一時間かそれ以上、このページをキャッシュしても問題なく動作するでしょう。 一方、一分経過するごとに新しい情報が格納される天気図をページに表示する場合は、 このページをキャッシュする事は意味をなさないでしょう。

キャッシュのセットアップ

まずはじめにキャッシュを有効にします。これは、 $cachingSmarty::CACHING_LIFETIME_CURRENT あるいは Smarty::CACHING_LIFETIME_SAVED を設定するだけです。

例 15.1. キャッシュを有効にする


<?php
require('Smarty.class.php');
$smarty = new Smarty;

// $smarty->cacheLifetime() の値を使って
// キャッシュの有効期限が決まります
$smarty->setCaching(Smarty::CACHING_LIFETIME_CURRENT);

$smarty->display('index.tpl');
?>

    

いつものようにテンプレートから出力内容をパースするために display('index.tpl') を呼び出しますが、 キャッシュを有効にした事でその出力内容をコピーしたファイルが $cache_dir 内に保存されます。次回 display('index.tpl') が呼ばれる際には、再びテンプレートをパースする代わりにキャッシュされたコピーが使用されます。

テクニカルノート

$cache_dir 内のファイルにはテンプレート名に類似した名前が付けられます。 拡張子は .php ですが、実際にはPHPスクリプトとして実行されません。 これらのファイルは編集しないで下さい!

各々のキャッシュされたページは、 $cache_lifetime 生存時間が限られています。デフォルト値は 3600 秒、つまり一時間です。 期限が過ぎた後、キャッシュは再生成されます。 $cachingSmarty::CACHING_LIFETIME_SAVED を設定する事によって、個々のキャッシュに自分自身の生存時間を与える事が可能です。詳細は、 $cache_lifetime を参照して下さい

例 15.2. キャッシュごとに生存時間を設定する


<?php
require('Smarty.class.php');
$smarty = new Smarty;

// 現在のキャッシュの生存時間は display がコールされるごとに残ります
$smarty->setCaching(Smarty::CACHING_LIFETIME_SAVED);

// index.tplに5分のcache_lifetimeをセットします
$smarty->setCacheLifetime(300);
$smarty->display('index.tpl');

// home.tplに1時間のcache_lifetimeをセットします
$smarty->setCacheLifetime(3600);
$smarty->display('home.tpl');

// 注: $caching が Smarty::CACHING_LIFETIME_SAVED のとき、
// 次のような$cache_lifetimeの設定は動作しません。
// home.tplのキャッシュの生存時間は既に1時間にセットされているので、
// もはや、$cache_lifetimeの値が尊重される事はありません。
// home.tplのキャッシュは、今までどおり1時間後に満期になるでしょう。
$smarty->setCacheLifetime(30); // 30 seconds
$smarty->display('home.tpl');
?>

    

$compile_check が有効 (デフォルト) の時、 キャッシュファイルに入り組んだすべてのテンプレートファイルと設定ファイルは 修正されたかどうかをチェックされます。 もしキャッシュが生成されてからいくつかのファイルが修正されていた場合、 キャッシュは即座に再生成されます。 これは最適なパフォーマンスのためには僅かなオーバーヘッドになるので、 $compile_check FALSE にして下さい。

例 15.3. $compile_check の無効化


<?php
require('Smarty.class.php');
$smarty = new Smarty;

$smarty->setCaching(Smarty::CACHING_LIFETIME_CURRENT);
$smarty->setCompileCheck(false);

$smarty->display('index.tpl');
?>

    

$force_compile が有効の場合、 キャッシュファイルは常に再生成されます。これは事実上、キャッシュ機能を無効にします。 しかし同時に、パフォーマンスの低下も引き起こします。通常、 $force_compile デバッグ 目的でのみ使用し、キャッシュは $caching を Smarty::CACHING_OFF にセットして無効にするのがさらに効率の良い方法です。

isCached() 関数は、テンプレートが有効なキャッシュを持っているかどうかを調べるのに使われます。 もしデータベースフェッチを必要とするようなテンプレートのキャッシュが存在する場合、 フェッチ過程をスキップするためにこの関数を使う事が出来ます。

例 15.4. isCached() を使用する


<?php
require('Smarty.class.php');
$smarty = new Smarty;

$smarty->setCaching(Smarty::CACHING_LIFETIME_CURRENT);

if(!$smarty->isCached('index.tpl')) {
    // キャッシュが有効でないので、ここで変数の割り当てを行います
    $contents = get_database_contents();
    $smarty->assign($contents);
}

$smarty->display('index.tpl');
?>

    

{nocache}{/nocache} ブロック関数、 {insert} テンプレート関数、あるいは大半のテンプレート関数に用意されている nocache パラメータによってページの一部を動的に保つ (キャッシュを無効にする) 事が出来ます。

例えば、すべてのページは右下に表示されるバナー以外はキャッシュが可能だとします。 バナー部分には {insert} 関数を使う事によって、キャッシュされたコンテンツの中に動的な要素を保つ事ができます。 詳細な説明や例は、{insert} のドキュメントを参照してください。

clearAllCache() 関数または clearCache() 関数によって、個々のキャッシュファイル (そしてグループ) をクリアする事ができます。

例 15.5. キャッシュをクリアする


<?php
require('Smarty.class.php');
$smarty = new Smarty;

$smarty->setCaching(Smarty::CACHING_LIFETIME_CURRENT);

// 全てのキャッシュファイルをクリアします
$smarty->clearCache('index.tpl');

// index.tplのキャッシュファイルのみクリアします
$smarty->clearAllCache();

$smarty->display('index.tpl');
?>