2006-11-11T11:57:30+09:00 追記があります(本文末)
タグアーカイブページの不満
いまだに自分はMT3.2を利用しています。“Tagwire”プラグインで「タグ」も使えるし、快適な感じ。
しかし、タグアーカイブページは動作が遅く、サーバに負荷がかかります。PHPスクリプトも使えないし。そこで、
- タグアーカイブページをPHPで出力したい
- 出力結果をキャッシュして欲しい
というのがずーーーっっっと(一年以上も!)悩んでいたのですが、今日、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化できます。そして、出力結果を一定時間キャッシュすることも可能です(後述)。
設置方法
- “mt-phpincgi.php”をサーバへ転送
- 同ディレクトリに“cgitmp”ディレクトリを作成(パーミッションは705)
- 動作テスト(重要!)
- “.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で出力する目的のみで導入するのが吉。それだけでもメリットはあるはず。