Smarty のキャッシュ
Smarty のデフォルトでは、キャッシュはオフになっています。キャッシュを有効にすると出力は、キャッシュされた内容をそのまま使いますので、display() 又は fetch() を呼び出す速度を短縮できます。
ただし、動的コンテンツの場合は、キャッシュする時間の設定には注意が必要です。更新間隔より長いキャッシュ時間を設定すると、情報が古く役に立たなくなります。
Smarty の設定
キャッシュを有効にするには、次のように $caching に true(又は 1)を設定します。
require('Smarty.class.php');
$smarty = new Smarty;
$smarty->caching = true;
$smarty->display('index.tpl');
?>
デバック時などは、$caching に false(又は 0 )を設定しキャッシュを無効にします。$caching = 2 を設定すと、個々のキャッシュ毎に個別にキャッシュ時間を与える事ができます。
ページごとに複数のキャッシュ
一つのテンプレートファイルを複数のページで利用する場合は、display() 又は fetch() を呼び出す時に、第2パラメータとして cache_id を渡します。cache_id を渡さない場合は、値を変更しても、キャッシュ時間が有効なときは他のページから利用しても、表示内容は変わりません。
Smarty の cache_id を使用したサンプルを作りました。サンプルは、同じページから同じテンプレートを呼んでいますが、表示内容を切り換えていますので、別のページから呼んだのと同じことです。
$smarty->is_cached() は、有効なキャッシュがあるかのチェックです。有効なキャッシュがある時は、$smarty->assign() は無視されますので、if(!$smarty->is_cached('id_smarty.tpl',$my_cache_id)) { 以降のスクリプトは、時間短縮のためキャッシュが無効の場合のみ実行しています。
使い方の理解に役立ててください。
サンプル: Smarty cache_id のサンプル
このサンプルのソースコードは、次の通りです。
id_smarty.php のソースコード
// Smarty cache_id のサンプル
if (!@include_once('Smarty.class.php')){
@include_once('Smarty/Smarty.class.php');
}
//通常は、require_once('Smarty.class.php');だけでOKですが、
// Smarty/Smarty.class.php のサーバーにも対応しました。
//require は、エラーで処理が中断するので include にしました。
$smarty = new Smarty;
$smarty->caching = 1;// キャッシュを有効にする
$smarty->cache_lifetime = 5;//キャッシュ時間は5秒
($_GET["no"])? $no = 0 : $no = 1 ;//数字トグル
//cache_id 有効/無効 切り替え
if ($_POST["cache"]=="") {
//このファイルが初期呼び出しや更新された場合
($_GET["ch"]=="")? $cache = "off" : $cache = $_GET["ch"] ;//cache_id 有効/無効
} else {
//このファイルが form から POST 通信された場合
$cache = $_POST["cache"];
}
if ($cache == "on"){
//cache_id 有効 なとき
$my_cache_id = "myid".$no;//cache_id 名をつける
} else {
$my_cache_id = "";
}
if(!$smarty->is_cached('id_smarty.tpl',$my_cache_id)) {
// キャッシュが有効でないときだけ実行
$contents = array(
'title' => 'cache_id',
'file' => basename($_SERVER['PHP_SELF']),//自分のファイル名
'no' => $no ,
'id_c' => $cache
);
$smarty->assign('contents',$contents);
}
if ( $cache =="on"){
//cache_id 有効
$smarty->display('id_smarty.tpl',$my_cache_id);//cache_id 使用
} else {
$smarty->display('id_smarty.tpl');
}
?>
templates/id_smarty.tpl のソースコード
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Smarty cache_id サンプル</title>
</head>
<body>
Smarty {$contents.title} のサンプルです。<br>
<br>
キャッシュ id が有効な場合、<br>
次のリンクをクリックすると対応したキャッシュが作られ、
数字がトグルします。<br>
キャッシュ id が無効な場合、同じキャッシュが使われ<br>
次のリンクをクリックしても、キャッシュが有効時間内( 5 秒)は、
数字は変わりません。<br>
<br>
<a href="{$contents.file}?no={$contents.no}&ch={$contents.id_c}">{$contents.file}</a> <= リンクをクリック<br>
<br>
{$contents.no} <= この数字に注目 <br>
<br>
現在 cache_id は、{$contents.id_c} です。<br>
<br>
<form action="{$contents.file}" method="POST">
<input type="radio" name="cache" value="off" {if $contents.id_c != "on"}checked{/if}> cache_id 無効 (off)<br>
<input type="radio" name="cache" value="on" {if $contents.id_c == "on"}checked{/if}> cache_id 有効 (on)<br>
<input type="submit" name="submit" value="cache_id 切り替え"> <br>
</form>
ボタンをクリックしても、キャッシュが有効時間内( 5 秒)は、
切り替わらないことがあります。
</body>
サンプルでは、cache_id を使ったときと、使わないときの切り替えをしていますので、少しややこしくなってしまいました。
ポイントは次の通りです。
require('Smarty.class.php');
$smarty = new Smarty;
$smarty->caching = true;//キャッシュを有効にする
$my_cache_id = "cache_id を定義";
if(!$smarty->is_cached('id_smarty.tpl',$my_cache_id)) {
// キャッシュが有効でないときだけ実行するスクリプト
}
$smarty->display('index.tpl',$my_cache_id);
?>
