テンプレートモジュール、ウィジェットのキャッシュのポイント
Movable Type 4.2 RC2 の提供を開始しました。ぜひお試しください。
テンプレートモジュール、ウィジェットのキャッシュ機能を使用すると、再構築にかかる時間の短縮を期待できます。キャッシュされたテンプレートは、そのキャッシュを保持している間、再構築は行われず、キャッシュの内容をそのまま使用します。キャッシュを保持する期間は、各テンプレートモジュール、またはウィジェットの編集画面で設定できます。また、モジュールや、ウィジェットを読み込む MTInclude ブロックタグにモディファイアを付与して、設定することもできます。
キャッシュ機能は、そのテンプレートの出力した内容をキーとひもづけて保持するので、キャッシュしたテンプレートモジュールを読み込むどのテンプレートでも、キャッシュした内容で読み込みます。どのテンプレートで読み込んでも、同じ内容で良いときは、問題ありませんが、テンプレートモジュール内で、テンプレートごとに条件分岐などで、読み込む内容を変化させようとしているときは、注意が必要です。簡単な例をみてみましょう。
<MTIf name="entry_template">
<p>このパラグラフはブログ記事アーカイブでのみ、表示されます。</p>
<MTElseIf name="page_template">
<p>このパラグラフはウェブページアーカイブでのみ、表示されます。</p>
</MTIf>
このテンプレートは、簡単な条件分岐を行っているテンプレートモジュールです。ブログ記事テンプレート、ウェブページテンプレートぞれぞれで、読み込んだときに出力する内容を変えるようにしてあります (アーカイブテンプレートに設定される変数についてはドキュメントを参照ください)。
このテンプレートモジュールを、テンプレート編集画面でキャッシュするように設定したとき、最初に再構築をおこなった内容を、自動的に設定されるキーにひもづけてキャッシュします。ですので、ブログ記事テンプレートでも、ウェブページテンプレートでも同じ内容で読み込んでしまいます。これは前述したように、ひとつキャッシュは、ひとつのキーにひもづいて管理されているからです。
では、条件分岐を使い、出力する内容を変更できるテンプレートモジュールはキャッシュできないのか。というと、そうではありません。キャッシュ機能の追加とともに、MTInclude ブロックタグにはいくつかのモディファイアを追加しています。
cache="1 | 0"
-
読み込むテンプレートモジュールの内容をキャッシュしたいときは、値に 1 を設定します。cache モディファイアのみを付与した場合は、キャッシュのキーは自動発行され、キャッシュの生存時間は60分に設定されます。キーや生存時間を別途設定したい場合は、
key
モディファイアかttl
モディファイアと併用します。テンプレートのカスタマイズや、デザインの調整などを行っているときは、0 に設定すると良いでしょう。
key="cache_key"
-
キャッシュのキーを設定します。このモディファイアは ttl または cache モディファイアが付与されていれば省略可能で、省略されたときは、自動的に key が発行されます。
ttl="0"
-
キャッシュの生存時間(単位は秒)を設定します。このモディファイアは key または cache もディファイアが設定されていれば省略可能で省略されたときは、初期値の60分が設定されます。
永久にキャッシュを保持したいときは、値に 0 と設定します。永久にキャッシュを保持する設定は、テンプレートタグで
ttl
モディファイアを使用した場合に設定できます。
テンプレートモジュールを読み込む MTInclude ブロックタグに key モディファイアを付与し、キャッシュのキーを設定してあげることで、問題は解決します。例のテンプレートをきちんと動作させるには、各テンプレートで次のようにします。
- ブログ記事アーカイブテンプレート
<$MTInclude module="Module Name" key="module_name::foo"$>
- ウェブページアーカイブテンプレート
<$MTInclude module="Module Name" key="module_name::bar"$>
これで、例のテンプレートモジュールは、読み込むテンプレートごとに違った結果を出力し、それぞれに設定されたキーにひもづいてキャッシュされます。例ではテンプレート単位でしたが、同じテンプレート内で何度か同じモジュールを読み込み、それぞれの出力結果を変えたいときなども同様の方法で対応できます。
- 前の記事: Movable Type 4.2 を発表しました
- 次の記事: コメントやトラックバックの件数でブログ記事をソート