第 13章キャッシュ

目次
キャッシュのセットアップ
ページごとに複数のキャッシュ
キャッシュのグループ
キャッシュ可能なプラグインの出力の制御

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

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

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

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

例 13-1. キャッシュを有効にする

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

$smarty->caching = true;

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

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

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

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

例 13-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にして下さい。

例 13-3. $compile_checkを有効にする

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

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

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

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

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

例 13-4. is_cached()を使用する

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

$smarty->caching = true;

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()関数によって、個々のキャッシュファイル(又はグループ)をクリアする事ができます。

例 13-5. キャッシュをクリアする

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

$smarty->caching = true;

// 全てのキャッシュファイルをクリアする
$smarty->clear_all_cache();

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

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