テンプレートの構築結果をキャッシュするプラグイン KeyCached

今回は、

で、とあるプラグインを見つけて導入してみたところ、トップページその他の再構築時間を短縮することができ、なんとか実用に耐えうるレベルまで持ってこれました。そのプラグインの紹介は、次のエントリーでじっくりしたいと思います。

と前回書いたプラグインのご紹介です。

サーバーをレンタルしているさくらインターネットのサポートより、MT4i にて、Web - DB 間の帯域を占有するような処理が走るといわれました。それはもしかしたら MT 側で重たいテンプレートを使用している為に再構築処理が重たいのではと睨み、再構築を高速化するべく色々と探してみた結果、見つけたのが表題のプラグインです。

KeyCached を導入すると、<MTKeyCachedKey>、<MTKeyCachedValue>という2つのテンプレートタグが使えるようになります。KeyCached はテンプレートの再構築時、<MTKeyCachedKey>で囲まれた文字列をキーにして<MTKeyCachedValue>で囲まれた文字列をキャッシュしておき、次回以降に再利用するプラグインです。

例えば、「KeyCached プラグインで再構築の高速化! : 亜細亜ノ蛾 - Weblog」にて紹介されているように、個別エントリーアーカイブにてエントリーの ID と更新日時 をキーにタイトルや本文、追記をキャッシュしておくと、エントリーが更新されない限りキャッシュが再利用されます。例えば、そのエントリーにコメントが投稿された際にはエントリー自体は更新されていないので、再構築が高速化されます。

使い方によっては、非常に便利で優れたプラグインです。しかしあまり普及していないように思います。キャッシュが必要なほどブログが肥大化しているユーザーが少ないこと、そんなヘビーユーザーはとっとと高性能なサーバーに移転していることなどがその一因と思いますが、「使い方が良く分からない」というのも大きな要因ではないかと思います。

例えば、<MTKeyCachedKey>については、以下のように説明されています。

ここで指定された値が,前回の再構築以降に変化した場合,以降に続くMTKeyCachedValueコンテナタグの内部が再構築されます。

「前回の再構築以降に変化した場合」とあるので、その変化をどういう形で検出しているのかと疑問に思っていました。例えば、「Aというテンプレートの何番目に出現したキー」、という風に記録しておいて、再構築時に比較するのかな、と考えていました。が、どうやら違う模様。

<MTKeyCachedValue>の値は、単に<MTKeyCachedKey>と括り付けて保存されているのみで、それがどのテンプレートのどの場所で使用されたものか、という情報は記録されていないようです。この為、<MTKeyCachedKey>の設定をきちんとしておかないと、思わぬ再構築結果が現れる場合があります。

例えばメインページにて、以下のようにしてみます。

<MTKeyCachedKey>
index:recentcomment:<$MTBlogCommentCount$>
</MTKeyCachedKey>
<MTKeyCachedValue>
    <div class="module-archives module">
        <h2 class="module-header">読者の声</h2>
        <div class="module-content">
            <ul class="module-list">
                <MTEntries recently_commented_on="10" sort_order="ascend">
                <li><a href="<$MTEntryPermalink$>#comments"><$MTEntryTitle trimj_to="38"$></a>(<$MTEntryCommentCount$>)<br />
                    <MTComments lastn="3">
                    └ <$MTCommentAuthor$> <a href="<$MTEntryPermalink$>#comment-<$MTCommentID$>">at <$MTCommentDate format="%Y/%m/%d %X"$></a><br />
                    </MTComments></li>
                </MTEntries>
            </ul>
        </div>
        </div>
</MTKeyCachedValue>

最新のコメント一覧を丸ごと、MTBlogCommentCount(ブログに投稿されたコメント数)をキーにキャッシュしています。新たにコメントが投稿されると MTBlogCommentCount が増えるので、その時以外には再構築されない、というのを狙ったのでした。しかし、これだと問題が発生。コメントスパムなどが投稿された時にそれを削除すると、MTBlogCommentCount の値が減る為に、以前の古いキャッシュが表示されてしまうのです。

これを回避する為、次のようにしています。

    <div class="module-archives module">
        <h2 class="module-header">読者の声</h2>
        <div class="module-content">
            <ul class="module-list">
                <MTEntries recently_commented_on="10" sort_order="ascend">
                <li><a href="<$MTEntryPermalink$>#comments"><$MTEntryTitle trimj_to="38"$></a>(<$MTEntryCommentCount$>)<br />
                    <MTComments lastn="3">
<MTKeyCachedKey>
index:recentcomment:<$MTBlogCommentID$>:<$MTCommentDate$>
</MTKeyCachedKey>
<MTKeyCachedValue>
                    └ <$MTCommentAuthor$> <a href="<$MTEntryPermalink$>#comment-<$MTCommentID$>">at <$MTCommentDate format="%Y/%m/%d %X"$></a><br />
</MTKeyCachedValue>
                    </MTComments></li>
                </MTEntries>
            </ul>
        </div>
        </div>

MTEntries と MTComments が呼ばれてしまうので、これでどれくらい高速化されているのかは分からないのですが、それは追々調べて行きたいところ。ただ、体感的に再構築が高速化されているのは間違いないです。私のように帯域を制限されているなど、DB への接続が非常に遅いと感じている場合には、大きな効果があると思います。

KeyCached を使用するにあたってもう一つ注意したいのが、キャッシュがどんどん肥大化していくという点。古い使われなくなったキャッシュは、削除されずに残っていきます。個々のキャッシュは大したことなくても、塵も積もれば何とやら。cron などで定期的に、古いキャッシュを消すような仕組みを仕込む必要があるかもしれません。

それと、前述の「亜細亜ノ蛾」にて以下のようなエントリーが。

これは是非試してみたいところ。

最後に。このプラグインを発見したのは11月15日でした。どうやらこの日、KeyCached の作者さんがシックス・アパートを訪れていたようです。何かの縁を感じずにはいられないのでした。