FileWriter を使ってタグ検索の結果をキャッシュする

Posted by
ぴろり
Posted at
2013/11/17 22:34
Trackbacks
関連記事 (0)
Post Comment
コメントできます
Category
プラグイン カテゴリ
カバーイメージ

 MovableType 標準の検索用スクリプト(mt-search.cgi)では、検索結果をキャッシュすることで動作速度を向上させていますが、スクリプトが起動してキャッシュ ヒットを調べてしまう時点でパフォーマンスの向上には限界があります。Apache のキャッシュ モジュールなどが使えれば良いのですが、レンタル サーバなどでは制限があったりします。さくらインターネットのレンタル サーバでは、幸い mod_rewrite モジュールの利用が解放されていますので、先日に公開した FileWriter プラグインを利用して、検索結果のうち、タグ検索をより高速にキャッシュ動作するようにしてみました。

この記事を Delicious に追加する   このエントリーをはてなブックマークに追加  

スクラップ帳 » FileWriter MovableType プラグイン

 テンプレートの再構築時に、コンテンツを指定されたファイルに書き出すためのプラグインです。例えば、キャッシュを生成して動作を高速化させるなどの使い方が考えられます。

  1. コンテンツをファイルに書き出す MovableType プラグイン:FileWriter 2013/11/17
  2. FileWriter を使ってタグ検索の結果をキャッシュする 2013/11/17 今ココ

動作の概要

  1. タグ検索のリクエストについて、キャッシュ ファイルがあれば、キャッシュを返します
  2. キャッシュ ファイルが見つからない場合、mt-search.cgi でタグ検索を行い、ブラウザに検索結果を返すと同時に、その内容をキャッシュ ファイルに保存します

 キャッシュ ファイルが存在しない、最初のタグ検索時(2.)には、mt-search.cgi が起動し、検索結果をブラウザに返すと同時にキャッシュ ファイルが生成されます。次回のタグ検索以降、1. の動作は Apache がキャッシュ ファイルを静的ファイルとして返すだけで、CGI が起動されることもないため高速に動作します。

タグ検索の結果をキャッシュ

 FileWriter プラグインは、ブロック内のコンテンツを指定したファイルに書き出します。そこで、検索結果のテンプレート全体を FileWriter ブロック タグで括って、検索結果をファイルに書き出してやります。キーワード検索まで対象にすると、後述の mod_rewrite だけでは処理しきれないので、今回はタグ検索の結果のみをキャッシュするようにしました。

<mt:IfTagSearch>
  <mt:If tag="SearchResultCount">
    <mt:SetVarBlock name="file_writer_path">archive/tag/<$mt:SearchString$>.html</mt:SetVarBlock>
  </mt:If>
</mt:IfTagSearch>
<mt:FileWriter path="$file_writer_path">
:
検索結果テンプレート
:
</mt:FileWriter>

解説

  • 1 行目 ... タグ検索の場合にのみ動作します。
  • 2 行目 ... 存在するタグであれば、検索結果数が 1 以上のはずです。ユーザの入力値(<$mt:SearchString$>)がファイル名の生成に使われるため、ここで悪意のある入力を防いでいます。
  • 3 行目 ... タグ名からキャッシュ ファイル名(file_writer_path)を生成します。
  • 6 行目 ... 検索結果を file_writer_path で指定されたファイルに保存します。キーワード検索時や、タグが存在しない場合、file_writer_path は設定されないので、FileWriter の仕様からファイルは生成されません。

mod_rewrite でキャッシュをチェック

 キャッシュが存在する場合には、そもそも mt-search.cgi が起動されることを防ぎたいので、mod_rewrite モジュールを使って、URL をいい感じにスマートにするついでに、キャッシュが存在するか調べるようにします。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^archive/tag/(.+)$ /cgi-bin/mt/mt-search.cgi?blog_id=1&tag=$1 [QSA,L]

解説

 キャッシュ ファイルが存在しない場合(1 行目)にだけ、2 行目で mt-search.cgi が呼ばれます。キャッシュが存在した場合には、キャッシュ ファイルの内容を静的ファイルとして返すだけです。先述の記述では、キャッシュ ファイルは、タグ名.html ですが、Apache の Auto Negotiation 機能によって、拡張子が自動的に補完されます。

キャッシュの失効

 キャッシュ ファイルの内容、すなわちタグ検索の結果が変化した際には、キャッシュ ファイルを失効させる必要があります。そのためには、簡易的に、そのタグを付けられたブログ記事/ウェブページが更新されたタイミングで、キャッシュ ファイルを削除します。具体的には、ブログ記事/ウェブページの個別アーカイブ テンプレート内で、そのエントリに付けられたタグ毎に mt:RemoveFile タグを利用して、キャッシュ ファイルを削除します。

<mt:EntryIfTagged>
  <mt:EntryTags>
    <mt:SetVarBlock name="cache_path">archive/tag/<mt:TagName>.html</mt:SetVarBlock>
    <$mt:RemoveFile path="$cache_path" case_insensitive="1"$>
  </mt:EntryTags>
</mt:EntryIfTagged>

解説

  • 2 行目 ... エントリに付けられた全てのタグについて
  • 3 行目 ... キャッシュ ファイル名を生成して
  • 4 行目 ... キャッシュ ファイルを削除します

 mt:RemoveFile タグの case_insensitive オプションは、一見するとよく判らない動作をしますが、これには理由があって、mt-search.cgi のタグ検索では、タグの大文字/小文字を区別しません。そのため、AmazonaMaZon でタグ検索をすると、検索結果は同じですが、それぞれ大文字/小文字を区別してキャッシュ ファイルが生成されてしまいます。case_insensitive オプションは、指定されたファイル名について、こういった大文字小文字の区別なく削除するためのオプションなのです(´・ω・)

まとめ?

  • mod_rewrite くらいしか解放されていないレンタルサーバなどで、プラグインの導入とテンプレートタグを組み合わせて、タグ検索結果の高速なキャッシュ動作を実現した
  • ディレクトリ区切り文字や空白を含むタグ名は考慮していない
  • マルチバイトのタグ名を使っている場合、タグ名がそのままキャッシュ ファイル名に入ってしまうのでイヤ~ンな感じ
  • ToDo: ブログ記事/ウェブページからタグを外した際にキャッシュが失効しない
この記事を Delicious に追加する   このエントリーをはてなブックマークに追加  


この記事を読んだ人はこんな記事も読んでいます記事リコメンデーションについて

カバー画像:コンテンツをファイルに書き出す MovableType プラグイン:FileWriter

関連記事/トラックバック

関連記事/トラックバックはまだありません

この記事にトラックバックを送るには?

コメントを投稿する

 
 (必須, 匿名可, 公開, トリップが使えます)
 (必須, 匿名可, 非公開, Gravatar に対応しています)
 (必須)
スパム コメント防止のため「投稿確認」欄に ランダムな数字 CAPTCHAについて を入力してから送信してください。お手数ですがご協力のほど宜しくお願いいたします。