ページごとに複数のキャッシュ
display()やfetch()の一つの呼び出しから、複数のキャッシュファイルを持つ事が出来ます。
例えばdisplay('index.tpl')を呼び出した時、いくつかの状況に応じて異なった内容の出力を持っているかもしれず、その出力ごとに別のキャッシュを持たせたいと思うかもしれません。
これは、関数を呼び出す時に第2パラメータとしてcache_idを渡す事で可能です。
例えばdisplay('index.tpl')を呼び出した時、いくつかの状況に応じて異なった内容の出力を持っているかもしれず、その出力ごとに別のキャッシュを持たせたいと思うかもしれません。
これは、関数を呼び出す時に第2パラメータとしてcache_idを渡す事で可能です。
例 13-6. display() に cache_id を渡す
<?php
require('Smarty.class.php');
$smarty = new Smarty;
$smarty->caching = true;
$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から渡されています。
それぞれにユニークな$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が存在しなければならない事を知っています。これをチェックして下さい!
前の例で、URLからarticle_idを扱うのは便利そうにみえましたが、それは悪い結果をもたらすかもしれません。
cache_idはファイルシステムにディレクトリを作成するのに使用され、そしてもしユーザーがarticle_idに極めて大きな値を渡そうとしたか、速いペースでランダムのarticle_idを送信するスクリプトを記述した場合、これはサーバレベルの問題を引き起こすかもしれません。
必ずその値を利用する前に、渡されたデータは汚染チェックを行って下さい。おそらくこの例では、あなたはarticle_idが10文字かつ英数字のみで構成され、データベース内に有効なarticle_idが存在しなければならない事を知っています。これをチェックして下さい!
is_cached()とclear_cache()に、第2パラメータとして同じcache_idを渡して下さい。
例 13-7. is_cached() に cache_id を渡す
<?php
require('Smarty.class.php');
$smarty = new Smarty;
$smarty->caching = true;
$my_cache_id = $_GET['article_id'];
if(!$smarty->is_cached('index.tpl',$my_cache_id)) {// キャッシュが有効でないので、ここで変数の割り当てを行う。 $contents = get_database_contents(); $smarty->assign($contents);}
$smarty->display('index.tpl',$my_cache_id);
?>
clear_cache()に第1パラメータとしてnullを渡す事で、特定のcache_idのすべてのキャッシュをクリアする事が出来ます。
例 13-8. 特定のcache_idの全てのキャッシュをクリアする
<?php
require('Smarty.class.php');
$smarty = new Smarty;
$smarty->caching = true;
// cache_idが"sports"のキャッシュをすべてクリアする
$smarty->clear_cache(null,"sports");
$smarty->display('index.tpl',"sports");
?>
このように同じcache_idを与える事で、キャッシュをまとめてグループ化する事が出来ます。