ページを動的に作って、データベースからデータを取り出したり、外部のソースを元にページを生成する場合、ほとんどがリアルタイムに情報が求められる訳ではありません。
サーバーやネットワークの負荷軽減とともに閲覧者にもレスポンスよく情報を発信するにはキャッシュ機能が必要になります。
Smartyは標準でキャッシュ機能を持っています。
しかもテンプレート毎ではなく与えたパラーメータ毎にキャッシュデータを保存しますので、かなり柔軟性があります。
require('Smarty.class.php');
$smarty = new Smarty;
$smarty->caching = true;
//キャッシュを有効にしています
$my_cache_id = $_GET['article_id'];
//キャッシュする場合のパラメータです。
//この場合はGETでわたされてた'article_id'をキーにしています。
//データベースのSQLをハッシュ化してキーにしたりもできます。
$smarty->display('index.tpl',$my_cache_id);
//表示の際にキャッシュ化します。
上記では毎回キャッシュデータがあっても周りの処理はそのままです。
キャッシュがないときだけ処理するという処理を作りたいときは
if(!$smarty->is_cached('index.tpl',$my_cache_id)) {
// キャッシュが有効でないので、ここで変数の割り当てを行う。
$contents = get_database_contents();
$smarty->assign($contents);
}
です。
これでデータベースへのアクセスや外部へのアクセスを大幅に減らせます。
キャッシュの生存時間は当然コントロールできます。
マニュアルをそのまま転記します。
require('Smarty.class.php');
$smarty = new Smarty;
$smarty->caching = 2; // 生存時間はキャッシュごと
// index.tplに5分のcache_lifetimeをセットする
$smarty->cache_lifetime = 300;
$smarty->display('index.tpl');
// home.tplに1時間のcache_lifetimeをセットする
$smarty->cache_lifetime = 3600;
$smarty->display('home.tpl');
// 注: $caching = 2の時、次のような$cache_lifetimeの設定は動作しません。
// home.tplのキャッシュの生存時間は既に1時間にセットされているので、
// もはや、$cache_lifetimeの値が尊重される事はありません。
// home.tplのキャッシュは、今までどおり1時間後に満期になるでしょう。
$smarty->cache_lifetime = 30; // 30 seconds
$smarty->display('home.tpl');