• 更新:
  • 投稿:
  • カテゴリィ:

2006-11-11T11:57:30+09:00 追記があります(本文末)

タグアーカイブページの不満

いまだに自分はMT3.2を利用しています。“Tagwire”プラグインで「タグ」も使えるし、快適な感じ。

しかし、タグアーカイブページは動作が遅く、サーバに負荷がかかります。PHPスクリプトも使えないし。そこで、

  1. タグアーカイブページをPHPで出力したい
  2. 出力結果をキャッシュして欲しい

というのがずーーーっっっと(一年以上も!)悩んでいたのですが、今日、2つとも解決しました!

ちなみに2番に関しては、自分が借りているサーバ(XREAのS61サーバ)では“CGI::Cache”を使った方法が上手く動作しない(キャッシュが無い状態では100%エラー)──っぽいので、いままでキャッシュ化していませんでした。つまり、アクセスがあるたびにCGIがページを出力するという、何とも恐ろしい状態。

2006-11-11T21:10:48+09:00 追記

……すいまセーン……ボク ウソついてまーした……。ということで、キャッシュされていないことが判明。本文末に追記しました。

“CGI::Cache”が使えている場合でも、出力をPHP化できると、いろいろメリットがあるので、導入をお勧めします。

今回紹介するのは「MT3.2 + Tagwire + MT-XSearch」な環境向けですが、「MT3.3標準タグ機能 + MT-Search」でも応用できそうです。試してないけど(©(o))

用意するもの

TagwireとMT-XSearchによる動的タグアーカイブ - Ogawa::Memorandaの「少し進んだ話題」の前まで(CGI::Cacheを利用する前まで)の導入が必要です。

The blog of H.Fujimoto:コメント/検索関連テンプレートのPHP化(その1)にある“mt-phpincgi.php”が今回の肝です。前から存在に気付いていましたが、突然、今日になって頭の中に神が降りてきました(おおげさ)。

このPHPスクリプトによって、MT-Xsearchの出力結果をPHP化できます。そして、出力結果を一定時間キャッシュすることも可能です(後述)。

設置方法

  1. “mt-phpincgi.php”をサーバへ転送
  2. 同ディレクトリに“cgitmp”ディレクトリを作成(パーミッションは705)
  3. 動作テスト(重要!)
  4. “.htaccess”を変更

ファイルの転送

まずはサーバに“mt-phpincgi.php”を転送します。

──自分の場合、「ちょっといたずら好きな方々」のことを考え、リネームしてから転送しました。あとで設定する“.htaccess”の設定の際に気をつければ、特にリネームしても問題ないようです。

テスト重要!

転送とディレクトリ作成が完了したら、まずは動作するか確認しましょう。

“http://example.com/mt/”に“mt-phpincgi.php”と“mt-xsearch.cgi”がある場合は、「firefox」タグページのURLはこんな感じになります。

http://example.com/mt/mt-phpincgi.php?requrl=http://example.com/mt/mt-xsearch.cgi?&search_key=Tagwire&blog_id=1&search=firefox

自分の場合はdelimiter=,(タグをカンマ区切り)とcase_sensitive=0(大文字小文字を区別しない)を追加しました。詳しくはTagwireのページをご覧ください。

http://example.com/mt/mt-phpincgi.php?requrl=http://example.com/mt/mt-xsearch.cgi?&search_key=Tagwire&delimiter=,&case_sensitive=0&blog_id=1&search=firefox

“.htaccess”を変更

さて、無事にタグページが表示された場合は、“.htaccess”を変更します。Ogawaさんの説明ページを参考にして、

RewriteEngine on
RewriteRule ^tag/(.*)$ /mt/mt-xsearch.cgi?blog_id=1&search_key=Tagwire&search=$1 [QSA,L]

と設定してある場合は、次のように変更します。バックアップは必ず取っておくこと!

RewriteEngine on
RewriteRule ^tag/(.*)$ /mt/mt-phpincgi.php?requrl=http://example.com/mt/mt-xsearch.cgi?&search_key=Tagwire&blog_id=1&search=$1 [QSA,L]

注意すること

ちょっとハマったのが“MT-XSearch”に渡すクエリ(“hoge=fuga”の部分)の順番。よく見てもらうと、上の例と下の例で順番を変えています。blog_idなどの順番によってはエラーになります。そのあたりはちょっとテストが必要ですね。

カスタマイズ

さて、これでタグページがPHP化できました! PHPスクリプトを埋め込んだり、readfileでファイルを読み込んだり、ヘッダ情報(Last-Modifiedなど)を出力したり、遣りたい放題できます。

そして、自分にとって一番うれしいのが、検索結果がキャッシュされることです。──ただ、標準では60秒間しかキャッシュされません。そのあたりは何らかの事情があるのかも知れませんが、キャッシュ期間を延ばすことにしました。

“mt-phpincgi.php”の102行目あたり、

if ($now - $mtime > 60) {

を下記のように変更しました。

if ($now - $mtime > 60*60) {

これで、一時間以内に同じページへアクセスがあった場合、すでに生成されたキャッシュから高速に読み込まれます。──よね?

最後に

改めて、素晴らしいプラグインを作られた、小川さんと藤本さんに感謝します!

(でもなんか、いろいろとツッコミどころがありそうなキガス──)

2006-11-11T11:57:57+09:00 追記

エラーがキャッシュ!?

調子に乗って、キャッシュする期間を4時間に延ばしました。

──が、“cgitmp”ディレクトリを見ると、妙~にファイルサイズの小さなファイルがあります。他のキャッシュファイルが20KByteくらいあるのに、いくつかは300Byteくらい。

ファイルの中を見ると、「CGIエラー」メッセージがキャッシュされていることが判明。──オイオイ、4時間もそのページはエラーになってるYo!

やっつけ仕事

ものすごく単純に考えて「キャッシュファイルのサイズが極端に小さかったら削除する」といいのでは、ということで3分ハッキング。

“mt-phpincgi.php”の101行目あたりから、

$mtime = @filemtime($fpath);
if ($now - $mtime > 60) {
    @unlink($fpath);
}

という部分を探して、

$mtime = @filemtime($fpath);
$fsize = filesize($fpath);
if ($now - $mtime > 60*60*4) {
    @unlink($fpath);
} elseif ($fsize < 1000) {
    @unlink($fpath);
}

と変更。ファイルサイズが1000Byteより小さかったら削除するようにしました。──多分、これで大丈夫かと(PHPの作法が分かってないので、変なコードになっている可能性有り)。

2006-11-11T21:12:28+09:00 追記

キャッシュされていない!

えっと、“mt-phpincgi.php”のソースコードを眺めていると、「もしかしてこれって……」と気付きました。

──PHPで出力された結果は一度だけ利用され、二度と使われないようです。つまり、キャッシュされてないも同じ。なので、上記の「4時間キャッシュして云々」はまるで意味がないです。

そういえば、元々が「コメント投稿と検索ページをPHPで出力する」プラグインなので、わざわざキャッシュして置く必要が無いわけで。なるほどー。

コードがシンプルなので、「ちょちょいのちょい」とハックすれば、自分の望み通り、一定時間キャッシュできそうです。──が、その「ちょちょいのちょい」ができたらもっと面白い記事を書けるよ? みたいな。

ということで、“mt-phpincgi.php”はあくまでもPHPで出力する目的のみで導入するのが吉。それだけでもメリットはあるはず。

[2] このページの一番上へ戻る