[SiteSearch Google]

November 10, 2006

MTの「タグ」アーカイブページをPHP化する方法

[ad]

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で出力する目的のみで導入するのが吉。それだけでもメリットはあるはず。

Google Adsense

コメント

コメントを投稿

"MTの「タグ」アーカイブページをPHP化する方法" にコメントを投稿することができます(別ウィンドウが開きます)。

トラックバック

このエントリーのトラックバックURL:

"MTの「タグ」アーカイブページをPHP化する方法"へのトラックバックはまだありません。

過去の記事

カテゴリィ一覧
  1. Movable Type
  2. その他
    1. アイデア
  3. ウェブ
    1. Weblog
    2. Webデザイン
    3. ちょっとイイ話
    4. へぇー(トリビア・雑学)
    5. オモロ
      1. オモロテキスト
      2. オモロニュース
      3. オモロ動画
      4. オモロ画像
    6. ニュース
  4. コンピュータ・エレクトロニクス
    1. PC
      1. Firefox
  5. マンガ・アニメ・ゲーム
    1. アニメ
      1. 新世紀エヴァンゲリオン
    2. オタク
    3. ゲーム
    4. マンガ
      1. 週刊少年ジャンプ
        1. DEATH NOTE
        2. HUNTER×HUNTER
        3. SKET DANCE
  6. 本・音楽・映画・TV
    1. TV・芸能
    2. 映画
  7. 食・健康・生活
    1. ファッション
    2. 食べ物