第7回 Smartyの便利な機能を使いこなす(その1:キャッシュ前編) - Smarty講座
yossy先生のSmarty講座
Lecutures on PHP
第7回 Smartyの便利な機能を使いこなす(その1:キャッシュ前編) (その2)
Smartyでキャッシュを使おう
では実際にキャッシュを利用する方法について説明します。
hello.php
1 <?php
2 ini_set('display_errors', 1);
3 define('SMARTY_DIR', '/usr/local/lib/Smarty-2.6.20/libs/');
4 require_once(SMARTY_DIR .'Smarty.class.php');
5 $smarty = new Smarty();
6
7 $smarty->template_dir = '/var/www/smarty/templates/';
8 $smarty->compile_dir = '/var/www/smarty/templates_c/';
9 $smarty->config_dir = '/var/www/smarty/configs/';
10 $smarty->cache_dir = '/var/www/smarty/cache/';
11
12 $smarty->caching = 1;
13 $smarty->assign('name', 'yossy');
14 $smarty->display('test.tpl');
15 ?>test.tpl
こんにちは、{$name}さん!!
今日は{$smarty.now|date_format:'%Y年%m月%d日'}です。
これは第1回で一番最初に説明したコードを一部変更したものです。
変更したのはPHPのコードの12行目です。
$smarty->caching = 1;
cachingというSmartyのインスタンス変数に値1を渡しています。これがSmartyのキャッシュを有効にするためのパラメータとなります。デフォルトでは0が設定されており、このときはキャッシュが無効になっています。なお、2を渡すとキャッシュの有効時間を変更することが出来ます。
$smarty->caching = 2;
$smarty->cache_lifetime = 600; // 有効時間が600秒に
cachingに2を設定した後、cache_lifetimeへ有効時間を設定することが出来ます。デフォルトの有効時間は3600秒です。
では実行してみましょう。出力結果は… 第1回の時と変わりませんね。

それでは13行目のassignで渡している名前の値を変えてみましょう。
$smarty->assign('name', 'hoge');
さて実行してみると… 名前を変更したのに出力結果へ反映されませんね。パラメータとして渡した結果とともにキャッシュされていることがわかります。

ではcache_dirで設定したディレクトリの中を見てみてください。パーミッションが変更されている場合はrootユーザーになるかsudoコマンドを利用するなどしてlsコマンドを実行してみてください。
% ls cache %%6D^6D7^6D7C5625%%test.tpl
…何か変な文字列がついたファイルが出来ていると思います。これがキャッシュデータを保持しているファイルになります。catコマンドで中身を見てみましょう。
% cat cache/%%6D^6D7^6D7C5625%%test.tpl
129
a:4:{s:8:"template";a:1:{s:8:"test.tpl";b:1;}s:9:"timestamp";i:1226996133;s:7:"expires";i:1226999733;s:13:"cache_serials";a:0:{}}こんにちは、yossyさん!!
今日は2008年11月18日です。
…意味不明な文字列が並んでいますが、後半にパラメータが埋め込まれた出力結果らしき文字列を見ることが出来るかと思います。このことからパラメータを含めてキャッシュされていることがわかるかと思います。
さて、最初のコードを少し変更したいと思います。
1 <?php
2 ini_set('display_errors', 1);
3 define('SMARTY_DIR', '/usr/local/lib/Smarty-2.6.20/libs/');
4 require_once(SMARTY_DIR .'Smarty.class.php');
5 $smarty = new Smarty();
6
7 $smarty->template_dir = '/var/www/smarty/templates/';
8 $smarty->compile_dir = '/var/www/smarty/templates_c/';
9 $smarty->config_dir = '/var/www/smarty/configs/';
10 $smarty->cache_dir = '/var/www/smarty/cache/';
11
12 $smarty->caching = 1;
13 if(!$smarty->is_cached('test.tpl')){
14 $smarty->assign('name', 'yossy');
15 }
16 $smarty->display('test.tpl');
17 ?>
12~15行目に注目してください。
$smarty->caching = 1;
if(!$smarty->is_cached('test.tpl')){
$smarty->assign('name', 'yossy');
}
ここでis_cached()というメソッドを呼んでいます。これはパラメータで渡されたテンプレートのキャッシュが有効かどうかをチェックしています。ここではif文でキャッシュが有効かどうかチェックし、無効の場合はパラメータをテンプレートへ渡しています。
上記の例では単純に文字列を渡しているだけですが、例えばデータベースからデータを取得してそれをテンプレートに渡すという処理を考えた場合、キャッシュが有効だったら、データベースへのアクセスを省略する、というような処理を記述することが出来るようになります。
キャッシュによる高速化とは単にテンプレートの解析時間の短縮というだけでなく、データ取得の効率化といった側面もあります。





ページのトップへ


今回のような実践的な経験がエンジニアのキャリアに繋がると思います。是非サービスを成功させて下さい!