SmartyにassignするデータをCache_Liteでキャッシュする
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時間以内にクロールしたページは表示が速くなります。本当はクローラーが拾いに来るときのページ生成を速くしたいのですが、それはなかなか難しいでしょうか。
クエリ付きのページでも、セッション変数を利用しているページでも、display() の第2引数である、cache_id をそれらに応じて unique にしてあげれば、クエリ毎でも、セッション変数毎にでも、キャッシュすることができます。(当然キャッシュファイルの量は増大します)
http://smarty.php.net/manual/en/caching.multiple.caches.php
>>とおりすがり様
Smartyのマニュアルあまり見ていなかったのでdisplayの第2引数は気づきませんでした。教えていただいてありがとうございます!