Chapter 14. キャッシュ

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

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

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

まずはじめにキャッシュを有効にします。これは、 $caching = 1 (あるいは 2) を設定するだけです。

Example 14.1. キャッシュを有効にする


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

$smarty->caching = 1;

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

    

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

テクニカルノート

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

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

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


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

$smarty->caching = 2; // 生存時間はキャッシュごと

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

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

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

    

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

Example 14.3. $compile_check を有効にする


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

$smarty->caching = 1;
$smarty->compile_check = true;

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

    

$force_compile が有効の場合、 キャッシュファイルは常に再生成されます。これは事実上、キャッシュ機能を無効にします。通常、 $force_compile デバッグ 目的でのみ使用し、キャッシュは $caching = 0. にセットして無効にするのがさらに効率の良い方法です。

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

Example 14.4. is_cached() を使用する


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

$smarty->caching = 1;

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

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

    

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

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

Example 14.5. キャッシュをクリアする


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

$smarty->caching = 1;

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

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

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