アルファサード株式会社 代表取締役 野田 純生のブログ


MTCMSCacheプラグイン(続き)。


公開日 : 2009-02-15 12:14:37


間があいてしまいましたが...(2月16日アップデートしました)

このプラグインによって以下の2種類のキャッシュを使えるようになります。

  • CGIへのリクエストの間、メモリ上に一時的に保存されるキャッシュ(※)
  • 指定したオブジェクトに変更が加えられた際にクリアされるキャッシュ(DBに保存される)

※調べたら既にプラグインがあったことに気づいたけど

ブロックタグ : MTRequestCacheBlock

指定出来るモディファイア :

  • key : キャッシュを識別するためのキー(必須)
  • blog_id : ブログのID(省略化)

mt.cgi等のCGIアプリケーションへのリクエストの間キャッシュされます。リクエストが終了するとキャッシュはクリアされます。

MTの場合、通常再構築が行われる際には、一度のリクエストで決まった数のアーカイブが再構築され、リダイレクトを繰り返しながらすべてのエントリーやアーカイブを再構築処理するわけです(同時に再構築されるエントリー数はEntryPerRebuild環境変数による)。

このブロックタグを使うことで、例えば一度のリクエストで20ファイルが再構築される設定の場合、このブロックタグ内は最初の1ファイルを再構築する時のみビルドされ、2つめのファイルから20ファイルまではキャッシュの内容が使われます。

このキャッシュはメモリに格納されるため、保存や読み出しは高速に行われます。リクエストが終了したらキャッシュはクリアされます。

<MTRequestCacheBlock key="RecentEntries">
    Some MTML...
</MTRequestCacheBlock>

例えばカテゴリアーカイブ内で「このカテゴリの最新記事」を表示するブロック等の場合は、「key」モディファイアにカテゴリーID等をつければ良いでしょう。

<MTSetVarBlock name="key">RecentEntries_<$MTCategoryId$></MTSetVarBlock>
<MTRequestCacheBlock key="$key">
    Some MTML...
</MTRequestCacheBlock>

ブロックタグ : MTCMSCacheBlock

指定出来るモディファイア :

  • key : キャッシュを識別するためのキー(必須)
  • blog_id : ブログのID(省略化)
  • object_ds : キャッシュがどの種のオブジェクトに依存するか(blog,category,folder,entry,page,tag)
  • object_id : キャッシュが依存するオブジェクトのID(0を指定すれば任意のオブジェクトの変更時にキャッシュをクリア)
  • children : 子オブジェクト(例えばカテゴリの子カテゴリやカテゴリに属するブログ記事等)に変更があった時にキャッシュをクリアするかどうか
  • primary : category(folder)の場合のみ指定可能。ブログ記事の主カテゴリとして指定されている場合のみ子オブジェクトとみなす
  • ttl : キャッシュの有効期限(秒:有効期限内であっても指定条件によってキャッシュはクリアされます※)
  • by_user : ログインしているユーザー毎のキャッシュとする

※省略した場合、600秒(10分)。mt-config.cgiに以下のように書くことで省略時のデフォルト秒指定を変更できます。

CMSTemplateCachePeriod 600

元々CMSの管理画面のために作ったのでこういう名前になったのですが、デザインテンプレートでも使えます。

有効期限(秒)を指定た間キャッシュされます。ただし指定したオブジェクトやそのオブジェクトが影響を受ける子オブジェクトに変更が加えられた時点でキャッシュはクリアされます。 キャッシュされたデータはデータベースに保存されます。

例えば以下のように指定した場合、キャッシュがクリアされる条件は次のようになります。

<MTSetVarBlock name="blog_id"><$MTBlogId$></MTSetVarBlock>
<MTSetVarBlock name="category_id"><$MTCategoryId$></MTSetVarBlock>
<MTCMSCacheBlock key="CategoryEntries" blog_id="$blog_id"
    object_ds="category" object_id="$category_id" children="1"
    primary="1" ttl="3600">
    Some MTML...
</MTCMSCacheBlock>
  • キャッシュされてから3,600秒経過した時
  • カテゴリが変更・削除された時
  • カテゴリのサブカテゴリが作成・変更・削除された時
  • そのカテゴリを主カテゴリ(primary="1"としているため)に指定したブログ記事が作成・変更・削除された時
<MTSetVarBlock name="blog_id"><$MTBlogId$></MTSetVarBlock>
<MTSetVarBlock name="entry_id"><$MTEntryId$></MTSetVarBlock>
<MTCMSCacheBlock key="EntrySummary" blog_id="$blog_id"
    object_ds="entry" object_id="$entry_id" children="1">
    Some MTML...
</MTCMSCacheBlock>
  • ブログ記事自身に変更・削除された時
  • ブログ記事のコメントが作成・変更・削除された時
  • ブログ記事のトラックバックが作成・変更・削除された時

例えばタグ・クラウドは以下のように指定してキャッシュすることが出来ます。

<MTCMSCacheBlock key="TagsBlock" blog_id="$blog_id"
    object_ds="tag" object_id="0" children="1">
    Some MTML...
</MTCMSCacheBlock>

このブロックのキャッシュデータは以下のタイミングでクリアされます。

  • タグが変更・削除された時(CMSの管理画面でタグを編集して保存した時など)
  • タグが付けられたブログ記事が作成・変更(タグが変更された場合のみ)・削除された時

2つのタグを併用することも出来ますし、MTCMSCacheBlockタグを入れ子にすることも出来ます。

<MTRequestCacheBlock key="SideBar">
<MTCMSCacheBlock key="BlogBlock" blog_id="$blog_id" children="1">
...
<MTTopLevelCategories>
<MTSetVarBlock name="category_id"><$MTCategoryId$></MTSetVarBlock>
<MTCMSCacheBlock key="CategoryBlock" blog_id="$blog_id"
    object_ds="category" object_id="$category_id" children="1">
...
</MTCMSCacheBlock>
</MTTopLevelCategories>
</MTCMSCacheBlock>
</MTRequestCacheBlock>


このブログを書いている人
野田純生の写真
野田 純生 (のだ すみお)

大阪府出身。ウェブアクセシビリティエバンジェリスト。 アルファサード株式会社の創業者であり、現役のプログラマ。経営理念は「テクノロジーによって顧客とパートナーに寄り添い、ウェブを良くする」。 プロフィール詳細へ