Movable Type 備忘録

 Movable Type 4.2 のキャッシュとサーバサイドインクルードについて

こんばんわ^^

訪問者さんからの質問で Movable Type 4.2 の機能の一つである、キャッシュとサーバサイドインクルードの使い方についてご質問があったので、この場をお借りしてお答えします。

キャッシュについて

まず Movable Type のキャッシュとはどういうものか…についてです。
キャッシュ機能とは、再構築した内容を一時保存しておき再利用するための機能です。 再利用することで、再構築の手間を省く( =再構築時間短縮 )ことができます。
※保存先はデータベース・・・とどっかで読んだ気がします。

ですので、テンプレートモジュールやウィジェットの編集画面を表示すると、そういった選択肢が可能になってます。

たとえば、「最近のエントリ一覧」をキャッシュするよう設定したとして、新しい記事を書いて投稿した場合、スタティックなページの場合以下のテンプレートが再構築されます。

  • 投稿したエントリページ
  • 投稿したエントリが属するカテゴリページ
  • 月別( 年別、日別... )ページ
  • 投稿したエントリが属するカテゴリ-月別ページ
  • インデックス

投稿したエントリページの再構築の際に、「最近のエントリ一覧」も再構築されます。再構築された内容がキャッシュ( 一時保存 )されて、以降の各ページ内で「最近のエントリ一覧」を表示してた場合には、一時保存された「最近のエントリ一覧」を再利用して新たに再構築しない…というわけですね ( ̄∇ ̄)b

[2008.08.03] また、MT の管理画面からキャッシュの設定を行わなくっても、テンプレート内から MTInclude ファンクションタグごとにキャッシュを指定することもできます。

以下に Movable Type 4.2 で追加された cache、key モディファイアを使用する例を記します。

メインインデックス

  1. <mt:SetVarBlock name="entry_cache">entry_cache<$MTEntryID$></mt:SetVarBlock>
  2. <$mt:Include module="<__trans phrase="Entry Summary" cache="1" key="$entry_cache">"$>

上記はわたしのサイトで配布してるテンプレートセットのメインインデックス一部になります。
青字の cache モディファイアでキャッシュの有効/無効を設定します。
赤字の key モディファイアはキャッシュされたデータにユニークなキーを割り当てています。 これにより「ブログ記事の概要」というテンプレートモジュールの内容がキーごとにキャッシュされます。

ご存知のように「ブログ記事の概要」テンプレートモジュールは、記事ごとにデータが異なるテンプレートモジュールです。普通にキャッシュしてしまうと、まったく同じ記事の概要が表示されてしまうのですが、キー( 上記例ではエントリ ID をキーにしてます )を割り振っておくことで個別の「ブログ記事の概要」がキャッシュされることになります。

何のためにこんなことするかといいますと、「ブログ記事の概要」テンプレートモジュールは以下のテンプレートで共有しています。

  • メインインデックス
  • カテゴリページ
  • 月別( 年別、日別... )ページ

キャッシュを利用しないと、上記テンプレートの再構築時に毎回「ブログ記事の概要」テンプレートモジュールが再構築されるため時間の無駄ですよね。
そこで、キャッシュにユニークなキー( エントリ ID )を割り振っておくことで、必要なときにキーに該当するキャッシュを再利用できるようにしてるわけですね ( ̄∇ ̄)b

The blog of H.Fujimotoさんとこではもっと詳しく説明されてます。

サーバサイドインクルードについて

一般的には、サーバサイドインクルードとは、サーバ側で予め用意されたコマンドを利用する仕組みをいいます。
Movable Type のサーバサイドインクルードにはいくつく種類がありますね。 上記の仕組みは SSI( #include コマンド )に相当します。

じゃぁ、このサーバサイドインクルードを使って何ができるか…というと、要するにブラウザからページにアクセスされた時に外部ファイルを読み込むことができます。

外部ファイルを読み込むことができる…ということは、動的に読み込むファイルの内容を変更することでリアルタイム!? な表示が可能になるわけですね ( ̄∇ ̄)b

たとえば、「最近のエントリ一覧」をサーバサイドインクルードに設定すると、サイト内のすべてのページで最新の「最近のエントリ一覧」を表示することができるようになります。
キャッシュのところで、新規エントリを投稿した場合に再構築されるページについて説明しましたが、スタティックなページの場合過去のページは再構築されません。
要するに、過去に再構築された内容がそのままになっています。
ですので、過去のページにおいて最近のエントリ一覧というのは、実は当時最近だった一覧が表示されるわけです ( ̄∇ ̄)b

トップページではエントリ一覧や月別一覧などは最新で表示されるけど、過去のページでは表示されない・・・という経験はありませんか!? これは上記のような理由からです。

以下にサーバサイドインクルードの種類を記します。

  • PHP のインクルード

    ブログを PHP 化( 各ファイルの拡張子は php )してる必要があります。その場合にはこちらを選択します。再構築すると以下のような出力がされます。

    <?php include("/●●●/●●●/includes_c/template_12345.php") ?>
    
  • Apache の SSI

    一般的に言われる SSI です。ブログの各ファイルの拡張子を shtmlにしている必要があります。その場合にはこちらを選択します。再構築すると以下のような出力がされます。

    <!--#include virtual="/●●●/●●●/includes_c/template_12345.shtml" -->
    
  • ASP のインクルード

    Movable Type をウィンドウズサーバで運用されてる場合に選択するようです。詳しいことは知りません。カンタンに調べてみたらスクリプトを埋め込んでおくことで、上記と同様に外部ファイルを読み込む…というもののようです。

  • JSP のインクルード

    こちらも ASP 同様ウィンドウズサーバで運用されてる場合に選択するようです。ASP と JSP の違いはよく分かりません。

再構築後出力されるファイルは、デフォルトではトップページと同じフォルダの下に includes_c/ というフォルダが作成されて、その中に外部ファイルとして保存されます。

保存先を変更したい場合には、mt-config.cgi 内に IncludesDir を追加して任意のフォルダ名に変更することができます。

注意すること

キャッシュにおいてもサーバサイドインクルードにおいても、すっごく便利な機能ではあります。でも、むやみに使い過ぎるととんでもないことになります。

  • キャッシュの注意点

    すべてのテンプレートモジュール、ウィジェットにキャッシュを使ってしまうと、思わぬトラブルに見舞われます。

    Movable Type では 1 つのテンプレートを使って、複数の異なるエントリページ、カテゴリページ、月別ページなどが表示されますね。
    要するにデータを差し替えることで全く異なるページが作成されるはずが、最初に再構築したデータがそのままキャッシュとして再利用されてしまうことで、URL の異なるまったく同じページが複数作られてしまいます。

    ですので、キャッシュを利用する際には各ページでまったく同じ表示をするテンプレートモジュールやウィジェットに対してのみ利用してください。

  • サーバサイドインクルードの注意点

    サーバサイドインクルードは先ほど説明したように、ページがアクセスされた時に外部ファイルを読み込む機能です。多用し過ぎるとサーバに負荷がかかり、結果的にページの表示が重くなってしまうかもしれません。

    ですので、必要な分だけ利用してください。たとえば、エントリが投稿されたことで変化する、最近のエントリ一覧、月別アーカイブ一覧などに使うと、過去のページでも常に最新の一覧表示がされるようになります。

以上ざっとですが、キャッシュとサーバサイドインクルードの説明してみましたが、分かって頂けたでしょうか (; ̄∇ ̄A
わたしの説明が下手っぴなのはいつものことなので、分からないことありましたらご連絡いただけたらと思います。

 Trackback Pings(0)

No trackbacks found.

 Comments(2)

#1: Posted by Author Profile Page @ August 3, 2008 [REPLY]
user-pic

こんにちは。
キャッシュを使う場合、ページによって出力内容が変わるテンプレートモジュールであっても、「キー」を指定してキャッシュを作り分けることができる場合があります。

http://www.h-fj.com/blog/archives/2008/06/14-114622.php

#2: Posted by Author Profile Page bzbellからへの返信 @ August 3, 2008 [REPLY]
user-pic

>>1 壱 さん

こんにちわ^^

> 「キー」を指定してキャッシュを作り分けることができる場合があります。

そうですね、ご指摘ありがとございますワクワク
さっそく記事の方に追記させてもらいますテレテレ

 Post a Comment

 

コメント用フィード