アクセスが集中するサイトや、アクセス数が多くなる予定のあるページなどではサーバ の増強などの対策を立てることができますが、アプリケーション側でも大きく負荷を軽 減することができます。

そこでSmartyに備わっているキャッシュ機能を使って処理の量を軽減させましょう。

今日、PHPの開発ではSmartyを使ったシステムが多く見受けられます。Smartyを使ったことがある方にとって、Smartyのキャッシュを使うことは難しいことではなく、むしろあっさり実装できてしまうことが嬉しいです。

それではSmartyのキャッシュ機能について紹介していきます。

まずはキャッシュの設定をしましょう。 Smartyクラス各メンバ変数の上書きです。

<?php
require_once "../libs/Smarty.class.php";
$smarty = new Smarty();

// まずはキャッシュを有効に設定
$smarty->caching        1;

// テンプレートファイルの更新チェックフラグ
$smarty->compile_check  false;

// キャッシュするディレクトリ設定
$smarty->cache_dir      '/var/www/cache_dir';

// キャッシュの生存時間(秒)を設定
$smarty->cache_lifetime 600;

$cache_dirで設定したディレクトリの作成と設定もしておきます。 と、これ位の設定で準備OKです。 $cachingを2に設定するとファイル毎に$cache_lifetimeが有効となります。 また、$compile_checkをtrueにするとテンプレートファイルの更新を毎回チェックしますので、オーバーヘッドが発生するので運用時はfalse、開発時はtrueにしておきましょう。

それではスクリプトの続きを見ていきます。

<?php
require_once "../libs/Smarty.class.php";
$smarty = new Smarty();

$smarty->caching        1;
$smarty->compile_check  false;
$smarty->cache_dir      '/var/www/cache_dir';
$smarty->cache_lifetime 600;

$cache_id $_SESSION['user_id'];

if (
$smarty->is_cached("cache.html"$cache_id)) {
  
$smarty->display("cache.html"$cache_id);
  exit;
}

sleep(10);

$smarty->assign("random" ,rand());
$smarty->display("cache.html"$cache_id);
?>

さぁ、いかがでしょうか? 毎回10秒スリープ処理(重い処理)をし、ランダムな値がアサインされるのですが、その処理が行われるのは初めてのアクセスのみで以降は10分経過しないとこの処理は行われないことが確認できます。 このサンプルスクリプトでは一つのテンプレートに複数(ユーザー毎)のキャッシュが存在する例となっておりますが、テンプレートが単一の場合はdisplay()・is_cached()メソッドに第2引数を与える必要はありません。

ほかにもこんな使い方はいかがでしょうか?

$chache_id = $_GET['search_value'] . $_GET['page_no'];
if ($smarty->is_cached("search_result.html", $cache_id)) {
  $smarty->display("search_result.html", $cache_id);
  exit;
}

検索結果一覧ページではかなり有用だと考えます。検索文言とページ番号までもキャッシュしてしまいましょう。

上記のように簡単にキャッシュを実装することができますが、実装する機能やキャッシュの生存時間設定を間違えるとバグと勘違いされるケースが出てきます。

膨大なアクセスがあるサイト、例えば1秒に200~300アクセスを超えるようなサイトでは$cache_lifetimeを1秒に設定してもかなり有効ですし、1分に1アクセスしかないサイトではキャッシュ機能の実装自体にコストをかける必要はありません。 まずはアクセスの集中するページや更新頻度などの角度からキャッシュ実装部分と設定をしっかり吟味することを肝に銘じておく必要があることをお忘れなく。


(アシアル 海原才人)

この記事は、アシアルが運営するPHP開発者のためのポータル&コミュニティサイト「PHPプロ!」で毎週配信しているPHP・TIPSメーリングリストを再録したものです。
同サイトでは、他にもPHP最新ニュースや、困ったときのQ&A掲示板、初心者向けのPHP講座など、PHP開発者をサポートする情報を掲載しています。