数千から1万エントリーくらいのブログを何とかせなあかん! ってな仕事がいくつかあったので、そのあたりにあわせて改良。
mod_rewriteに対応させるとともに、バックグランド再構築を「エントリー保存時」「全再構築時」のどちらで実行させるかをそれぞれに選択出来るようにした。 mod_rewriteに対応させるときは以下のようにテンプレートに.htaccessとか設定しておくと良いかも。
Options -Indexes +SymLinksIfOwnerMatch
<IfModule mod_rewrite.c>
<IfModule mod_dir.c>
DirectoryIndex index.php index.html index.htm default.htm default.html default.asp <$MTCGIRelativeURL$>plugins/RebuildAt1stView/RebuildAt1stView.cgi
</IfModule>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ <$MTCGIRelativeURL$>plugins/RebuildAt1stView/RebuildAt1stView.cgi [L,QSA]
</IfModule>
<IfModule !mod_rewrite.c>
ErrorDocument 404 <$MTCGIRelativeURL$>plugins/RebuildAt1stView/RebuildAt1stView.cgi
ErrorDocument 403 <$MTCGIRelativeURL$>plugins/RebuildAt1stView/RebuildAt1stView.cgi
</IfModule>
あと、FileInfoテーブルとBackgroundRebuildテーブル(プラグインで拡張したテーブル)をそれぞれ管理画面からクリアできるようにした。
なぜなら、アーカイブマッピングなんかを変更した時にFileInfoに古いデータが残っていたりする時に再構築時にエラーが発生することがあるので。クリアしたら一旦全構築すれば最新のデータに更新されます。
管理画面のプラグイン設定は以下のような感じに。エントリーの数が多い場合はこの設定のように「エントリー保存時」のみバックグラウンドで再構築する設定がおすすめ。エントリーが数千もあるブログで全再構築をかけると、BackgroundRebuildテーブルに再構築対象のファイルがリストアップされるのですが、このテーブルに数千もファイルが登録されてしまうと、単にエントリーを更新した時にもこの数千に対して処理を行おうとするので何か効率が悪いというか、気持ち悪かったのでこのように。
全再構築後の静的ファイルの生成は run-periodic-task実行時にまとめて行うと良いかと。

また、RebuildAt1stView.cgiをfcgi化しておくとファイルが存在しない時の閲覧がスムーズになるけれどもこちらの事象が気になる方は定期的にプロセスを立ち上げ直すようにしておくと良いかと(実際に僕はそうしている)。
ダウンロード
以下プラグイン開発のためのメモ。
build_file_filter コールバックが呼ばれた時に、それがエントリー保存後の再構築なのか全再構築時の再構築処理なのか、はたまた別のCGI(コメントとか)とかタスク実行による再構築なのかが分かれば、ケースによって再構築を行うかどうかの分岐が出来るのではないかと思ってちょっとMTの振る舞いを調べてみた。
Apache限定かと思うけど、結局は以下のような環境変数をチェックしてケースバイケースで分岐させれば良いんだわ。
- $ENV{'REDIRECT_URL'};
- $ENV{'SCRIPT_NAME'};
- $ENV{'QUERY_STRING'};
- $ENV{'REQUEST_URI'};
- QUERY_STRINGに「'&type=entry-'+数字&」が含まれていたらエントリー保存時の再構築と判断
- SCRIPT_NAMEがAdminScript(例:mt-cgi)でなければ別のスクリプトからの再構築(よって、RebuildAt1stView.(f)cgi, BackgroundRebuild.cgiが含まれていたら再構築を行う、等の分岐をさせる)
- REDIRECT_URLに値が入っていたら、NotFoundによって渡されたリクエストからの再構築
- mod_rewriteによるリクエストはREQUEST_URIをチェック、とか

ものすごくタイムリーでした!今までダイナミック・パブリッシングを使っていましたが、近頃、アクセス過多でものすごいサーバに負荷がかかっていましたが、このプラグインのおかげで、その負荷からかなり救われそうです!
どうも公開ありがとうございました!MT4.1β3でも動作しました!
P.S. インデックステンプレートでモジュール化しているかたは、「リアルタイムに再構築する」にチェックをいれないとエラーがでるようです。
MTのタグアーカイブを.htaccessで静的にみせているのですが、このGreg Packer's Publishingに記載されている.htaccessコードを入力すると出来なくなってしまいました。
どうにか同居できるようにできないでしょうか? もしよろしければご教授お願いいたします。
MTタグを静的化するコードはこんな感じです。
RewriteEngine on
RewriteRule ^word/(.*)/+ /cgi/mt/mt-search.cgi?tag=$1&blog_id=1
# don't serve mtview.php if the request is for a real directory
理論値さん
このあたりは基本的にRewriteRuleの書き方の問題だと思うのですが、
要は wordで始まらないときはRebuildAt1stView.cgiに処理させる、ということを書いてやれば良いのだと思いますがいかがでしょうか。
RewriteRule ^word/(.*)/+ /cgi/mt/mt-search.cgi?tag=$1&blog_id=1
RewriteRule ^([^word])$ /mt/plugins/RebuildAt1stView/RebuildAt1stView.cgi [L,QSA]
↑
すいません、ロクに調べていませんし試してないません。
junnamaさんコメントありがとうございました。
以下のコードで無事タグアーカイブの静的化に成功しました。こんな有益なプラグインを提供していただきありがとうございます!
Options -Indexes +SymLinksIfOwnerMatch
DirectoryIndex index.php index.html index.htm default.htm default.html default.asp plugins/RebuildAt1stView/RebuildAt1stView.cgi
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/word/
RewriteRule ^(.*)$ plugins/RebuildAt1stView/RebuildAt1stView.cgi [C,QSA]
RewriteRule ^word/(.*)/+ /cgi/mt/mt-search.cgi?tag=$1&blog_id=1[L]
ErrorDocument 404 plugins/RebuildAt1stView/RebuildAt1stView.cgi
ErrorDocument 403 plugins/RebuildAt1stView/RebuildAt1stView.cgi
はじめまして。以前GPLと商用のライセンスを併用する。というお話でしたが、このバージョンもその範囲なのでしょうか?
さらに、MTは無償個人ライセンスを利用してもこのプラグインは商用の範囲なのでしょうか?
その場合の使用する条件などはありますか?
いきなり質問ばかりで申し訳ありません。
どうぞ、宜しくお願いします。
>定期的にプロセスを立ち上げ直すようにしておくと良いかと(実際に僕はそうしている)。
参考までに、定期的にではなくアプリケーションインスタンスあたり一定回数のリクエストで終了するようにした方がよいです。重要なのは、FastCGIプロセスのRSSが(工学的に)安全な範囲に納まることです。「100回でリスタートするから最悪でも30MBまでしか使わない(だろう、ある程度の確からしさで。)」と分かっていることが重要なわけです。
mod_fcgidにはMaxRequestsPerProcessという誂え向きの機能がありますし、それが使えない場合でもMT::Bootstrapをちょっと修正すれば同じことができます。
>MT::Bootstrapをちょっと修正すれば同じことができます。
↑こっちに興味がありますね、というか、「がつんと下げる」あれとも関係あるんでしょうかね。
いくつかの中〜大規模サイトをMT4で中期的?に運用した経験から言うと、(サーバーにもよりますが) mod_fcgid より mod_fastcgi の方が安定していて、そちらで動かしているケースが多いです。どーも僕はmod_fcgidと相性が悪いようです...
MT4.15にバージョンアップすると、なぜかこのプラグインをいれてるとインデックステンプレート、アーカイブテンプレート、モジュールテンプレート、システムテンプレートの新規作成ができなくなりました(リンクが消えている)
あと、たまに再構築すると全然別のカテゴリフォルダに関係ないエントリが構築されるようになりました。(その場合かなり再構築に時間がかかる)
ただいまこのプラグインを失うとサイトの運営が困難になってしまうので、ぜひ修正版をだしてもらえないでしょうか? もしよろしければぜひお願いいたします。m(_ _)m
はじめまして。このプラグインのコメントにあった、ライセンスさんの記入されていたことなのですが、
>なぜかこのプラグインをいれてるとインデックステンプレート、アーカイブテンプレート、モジュールテンプレート、システムテンプレートの新規作成ができなくなりました(リンクが消えている)
と言う現象が現在私のMTでもおきています。
なので、.htaccessとかのテンプレートも作成できない形になっています。
こちらは現在解消されたバージョンなどあるのでしょうか?
自分のMTバージョンは、
MTOS の version 4.23-ja です。