前回、<mt:Entries>の実行回数を減らし、出力結果を変数化することで、再構築の待ち時間を減らすことを検証しました。(前回の記事:Movable Type 再構築高速化 考察(1))
今回は、キャッシュの動作について検証してみたいと思います。
MovableTypeのバージョンは6でも7でも動作は変わりません。
記事の更新をトリガーに関連するテンプレートが再構築されますが、その中には変更がない箇所もあったりします。
このような、変数を使用しているけれどほぼ変更がない部分に「キャッシュ」を使います。
キャッシュとは、メモリ上にデータを保管して再利用する機能です。
キャッシュが残っている期間中は再構築をスルーすることができ、待ち時間を短縮することができます。
ちなみにキャッシュは、保存期間の切れたあとの再構築の実行タイミングでクリアされます。
初期状態ではキャッシュを使う状態にはなっていません。
[設定]>[全般]のページ内の、[モジュール設定]の「モジュールのキャッシュ」にチェックを入れると使用できるようになります。
モジュールテンプレートの下部にある「モジュールのキャッシュ」で設定します。
選択肢は3つ。
デフォルトでこれが指定されています。
書いてあるとおりキャッシュ機能を使用しません。
再構築されてから、次回に再構築可能になるまでの時間間隔を指定します。
例えば30分であれば、30分間再構築をスルーします。
記事を連続で作成/更新する場合などに効果を発揮します。
指定できる項目は8つ+αあります。
選択した項目を「作成/更新」後にキャッシュされた内容をリセットします。
例えば、カテゴリのナビゲーションリストをモジュールテンプレート化して、「カテゴリ」を選択しておけば、カテゴリ名などの変更が入らない限りキャッシュされ続けます。
「記事」の「作成/更新」の対象となるのは、モジュールテンプレートの所属する「ウェブサイト/ブログ(7だとサイト)」となります。
なので、キャッシュ設定しているモジュールテンプレートが、記事と同じ場所にない場合はクリアされません。
ウェブサイト(サイト)
└ ブログ(サイト):記事更新対象
└ モジュールテンプレート
ウェブサイト(サイト)
│ └ モジュールテンプレート
└ ブログ(サイト):記事更新対象
モジュールテンプレートのキャッシュ設定だけだと、モジュール1つに対して1つのキャッシュしか保存できません。
たとえば、記事ページにカテゴリナビがあるとします。
そのナビに記事の所属するカテゴリを強調する処理をつけている場合、モジュールテンプレートのキャッシュ設定だと、全ての記事の表示が同じになってしまいます。
(最後に再構築された記事ページの内容になります。)
カテゴリごとにモジュールテンプレートを作成するのは本末転倒なのでやりたくない...。
(カテゴリアーカイブでナビを作成してPHPインクルードという手もある。)
このような場合は、インクルードタグのcacheモディファイアを使えば解決できます。
<mt:SetVarBlockname="cache_key">key-<$mt:EntryCategory$></mt:SetVarBlock><$mt:Includename="RelatedEntries"key="$cache_key"ttl="3600"cache="1"$>
cacheを1でオンにして、keyを「カテゴリ名(cache_key)」を使用して指定します。
保存期間(ttl="3600"で1時間)は運用スタイルをみて適当に決めておきます。
以上のようにすれば、カテゴリごとにキャッシュされるのでテンプレートは1つで完結できます。
(keyを使わないと、最後に再構築されたもの一つだけが表示されてしまう)
実際にブログの一部をキャッシュして全体再構築をした場合、どれくらい差が出るか実験してみました。
キャッシュの設定をしたのは、右カラムの記事一覧3箇所です。
1回目: 16 分, 16 秒
2回目:16 分, 33 秒
3回目:16 分, 32 秒
4回目:16 分, 24 秒
1回目:12 分, 55 秒
2回目:13 分, 1 秒
3回目:12 分, 29 秒
4回目:12 分, 36 秒
右カラムの<mt:Entries>を3つほどキャッシュすることで約4分ほど再構築の時間を短縮することができました。
以上のように、テンプレートのキャッシュ処理を使いこなすことで、無駄な再構築の時間を減らすことができ、管理画面の体感レスポンスも向上します。
アクセスしてくるユーザーには全く関係ない話ですが、日々MovableTypeを利用するユーザーに対する効果は抜群なので、キャッシュを考慮したテンプレート構成を考えていきましょう。
(※ダイナミックパブリッシングには全く関係ありません。笑)