ページごとに複数のキャッシュ

display()fetch() のひとつの呼び出しから、複数のキャッシュファイルを持つ事が出来ます。 例えば display('index.tpl') を呼び出した時、 いくつかの状況に応じて異なった内容の出力を持っているかもしれず、 その出力ごとに別のキャッシュを持たせたいと思うかもしれません。 これは、関数を呼び出す時に第2パラメータとして $cache_id を渡す事で可能です。

例 15.6. display() に $cache_id を渡す


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

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

$my_cache_id = $_GET['article_id'];

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

     

上記の例では、$cache_id として display() に変数 $my_cache_id を渡しました。 それぞれにユニークな $my_cache_id の値を与える事で、index.tpl の別々のキャッシュが生成されます。 この例では、$cache_id として使われる article_id は URL から渡されています。

テクニカルノート

クライアント (Web ブラウザ) から Smarty (又はいくつかの PHP アプリケーション) に値を渡すときには用心しなくてはいけません。前の例で、URL から article_id を扱うのは便利そうにみえましたが、それは悪い結果をもたらすかもしれません。 $cache_id はファイルシステムにディレクトリを作成するのに使用され、 そしてもしユーザーが article_id に極めて大きな値を渡そうとしたり、速いペースでランダムの article_id を送信するスクリプトを記述した場合、 これはサーバレベルの問題を引き起こすかもしれません。必ず、 値を利用する前に渡されたデータの汚染チェックを行って下さい。おそらくこの例では、 あなたは article_id が10文字かつ英数字のみで構成され、データベース内に有効な article_id が存在しなければならない事を知っています。これをチェックして下さい!

isCached()clearCache() には、第2パラメータとして同じ $cache_id を渡すようにしましょう。

例 15.7. isCached() に cache_id を渡す


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

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

$my_cache_id = $_GET['article_id'];

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

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

     

clearCache() の第1パラメータとして NULL を渡すと、指定した $cache_id のすべてのキャッシュをクリアすることができます。

例 15.8. 特定のcache_idの全てのキャッシュをクリアする


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

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

// cache_idが"sports"のキャッシュをすべてクリアする
$smarty->clearCache(null,'sports');

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

     

このように同じ $cache_id を与える事で、 キャッシュをまとめて 「グループ化」 する事が出来ます。