Greg Packer's Publishingその後。
公開日 : 2008-01-14 17:28:28
数千から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をチェック、とか