ネットサービスとかGoogleとか豆知識とか。

Index > プログラミング > SmartyにassignするデータをCache_Liteでキャッシュする
プログラミング
2007年04月20日 02:19

SmartyにassignするデータをCache_Liteでキャッシュする

  • このエントリーをはてなブックマークに追加
  • ... PV
スポンサード リンク

Tips検索のページ表示処理がかなり遅かったのでキャッシュを使用するようにしました。具体的には、Smartyにassignする配列データをseriarizeしてCache_Liteでキャッシュするようにしただけです。これだけで体感10倍速くなりました。

Smartyにもキャッシュ機能はありますが、Smartyのキャッシュはテンプレート単位でキャッシュするようです。そのためクエリ付きのページに適用すると異なるクエリであっても同じコンテンツが表示されてしまうので使えません。

(補足: コメントで「Smartyのdisplayの第2引数にユニークなIDを与えれば、クエリ単位でもキャッシュできる」と教えていただきました。ありがとうございます。)

そこで、Smartyの表示結果ではなくSmartyに与えるデータをキャッシュする方法を採用しました。処理の流れをかなり省略して書くと以下の通り。

$cache = new Cache_Lite($options);
/* キャッシュ取得 */
$data = $cache->get($query);
if (!$data) {
    /* データ生成処理 */
    ・・・
    /* キャッシュ保存 */
    $cache->save(serialize($contents), $query);
} else {
    /* キャッシュデータを利用 */
    $contents = unserialize($data);
}
$smarty->assign($contents);
$smarty->display();

Tips検索の各ページは更新頻度が低いコンテンツで構成されているので、キャッシュのライフタイムは長めに48時間を設定しています。キャッシュされていないページは最初の1回目の表示だけは重いですが、2回目以降は素早く表示されます。

サイト内の大半のページは検索エンジンのクローラーが人より先にアクセスするので、検索エンジンが48時間以内にクロールしたページは表示が速くなります。本当はクローラーが拾いに来るときのページ生成を速くしたいのですが、それはなかなか難しいでしょうか。