MovableType のテンプレートが肥大化・複雑化すると,その再構築に要する時間やサーバ負荷が増すことになります。しかし実際のテンプレート中には,再構築によってその内容が変化しない部分が少なくありません。そのような部分については毎回々々構築を行う必要はなく,前回に構築された結果を流用することによって,テンプレート全体の再構築に要する時間や負荷を軽減できると期待できます。
テンプレート中の任意のブロックを再構築するか否かの判断が,一つ以上の値に依存しているとします。単純な例を挙げると,前回の再構築から記事の最終更新日が変化していないのであれば,<$MTEntryTitle$>,<$MTEntryBody$> や <$MTEntryMore$> などのテンプレートタグのみを含むブロックは再構築の必要がありません。そのようなブロックには前回の再構築のタイミングでキャッシュされていた内容を流用することで,これらテンプレートタグの構築処理を省略することができます。
ところで <$MTInclude module="..."$> は,テンプレートをモジュール化しているだけなので,モジュールに含まれるテンプレートタグの再構築を省略することはできません。一方,KeyCached ではテンプレートタグを一度構築した結果をキャッシュとして保存し,次回以降の再構築の際にテンプレートタグを解析・構築する替わりに,保存されたキャッシュを利用するため,その部分の再構築処理の一切を省略できる点が異なります。
ブログの検索結果ページ全体を KeyCached を用いて高速化した場合の効果を測定してみました。MovableType の検索機能は,検索の度に内部で構築処理が行われているため,キャッシュの恩恵が大きく現われます。検索結果は検索文字列にのみ依存しているものとします。実際には記事が追加/編集/削除されることを考慮する必要がありますが,とりあえずキャッシュの有効期間を短くすることで対応することにします。
| # | min [ms] | mean [ms] | max [ms] | total [s] |
|---|---|---|---|---|
| KeyCached 無し | ||||
| 1 | 2,454 | 2,844 | 3,657 | 28.45 |
| 2 | 2,611 | 2,856 | 3,342 | 28.57 |
| KeyCached 有り | ||||
| 1 | 824 | 1,197 | 2,117 | 11.98 |
| 2 | 885 | 1,314 | 1,711 | 13.15 |
さくらインターネットのレンタルサーバで稼動しているMTに対して,計測には Apache Bench を使用しました。ab -n 10 -c 1 <URL>
ソースコードの最新版とマニュアルは KeyCached の Trac リポジトリを参照してください。
寄せられたコメント (最新 5 件を表示しています)
>もしかして生成された文字列ではなく,その中間にあるkeywords変数そのものをキャッシュしたい,ということですか?
その通りです。
同じようなコードでキーワード抽出を行い、metaタグのなかで使ったりタグクラウドに加工したりしているのですが、その都度同じ処理を繰り返すのは間抜けなので、加工前のデータをcacheできればと考えたんです。
ありがとうございました。
例のコードは目的がmetaタグを出力することであって,keywords変数は単なる中間生成物(?)ですから,metaタグの生成をキャッシュするだけならコード全体をMTKeyCachedValueで囲ってやれば,キーワード抽出の部分は軽量化できます。
もしかして生成された文字列ではなく,その中間にあるkeywords変数そのものをキャッシュしたい,ということですか?
だとすれば,このプラグインでは無理ですねぇ… おそらくmemcachedなどのやっていることに近くなるのではと思います。
ごめんなさい。<が飛んじゃいました。
たとえば、「アーカイブページごとにSEOを考えた最適なキーワードを自動設定する方法」の
「最適なキーワードを自動的に設定する」に書かれているコードですが、
最後の行の"meta"以前の処理をcacheする事はできませんよね。
$MTSetVar name="keywords" value="$__key__" function="push"$
の"keywords"がcacheできればと思うのです。
つまり「ローカルスコープ変数を作る MovableType プラグイン:LocalBlock」の
MTLocalBlockとは逆で、MTSetVarの処理結果をcacheできたらと思うのですが、
こんなことできるようになりませんか?
MovableType.jpのプラグインディレクトリに収録されました(´∀`)
http://www.movabletype.jp/plugins/keycached.html
素早い対応ありがとうございます!
早速DLして導入してみたいと思います。