第7回 Smartyの便利な機能を使いこなす(その1:キャッシュ前編) - Smarty講座

PHP基礎編

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');
}

yossy先生ここでis_cached()というメソッドを呼んでいます。これはパラメータで渡されたテンプレートのキャッシュが有効かどうかをチェックしています。ここではif文でキャッシュが有効かどうかチェックし、無効の場合はパラメータをテンプレートへ渡しています。

上記の例では単純に文字列を渡しているだけですが、例えばデータベースからデータを取得してそれをテンプレートに渡すという処理を考えた場合、キャッシュが有効だったら、データベースへのアクセスを省略する、というような処理を記述することが出来るようになります。

キャッシュによる高速化とは単にテンプレートの解析時間の短縮というだけでなく、データ取得の効率化といった側面もあります。

  



Pick Up Q&A

Q
負荷時のmysql_connect()エラー
 このエントリーをはてなブックマークに追加 
A
これはPHPというよりOSまたはMySQLのコミュニティで質問されたほうがいいと思います。 ぱっと思いついた範囲で記すと MySQL等のDBに「ある時点において同時に接続可能なクライアントの最大数」に制限があるよう...

>>続きを読む

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

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)