Movable Type では,TrackBack 受信時にインデックスページしか再構築されません.従って,アーカイブページ *1には TrackBack が反映されません.Movable Type 自体にアーカイブページの再構築処理を追加すれば反映させることが出来ますが,処理完了を通知するまでに時間がかかり,タイムアウトが起きやすくなってしまいます.
そこで,再構築のプロセスを分離しバックグラウンドで処理させることにより,処理完了の応答を早く返せるようにしてみました.
はじめに
Movable Type では,TrackBack 受信時にインデックスページしか再構築されません.従って,アーカイブページ *2には TrackBack が反映されません.Movable Type 自体にアーカイブページの再構築処理を追加すれば反映させることが出来ますが,処理完了を通知するまでに時間がかかり,タイムアウトが起きやすくなってしまいます.
そこで,再構築を別のプロセスに分離しバックグラウンドで処理させることにより,処理完了の応答を早く返せるようにしてみました.再構築の対象は,TrackBack 受信時に標準で再構築されるページだけでなく,エントリ登録時に再構築されるものと同じです.また,再構築プロセスの起動数を制限することにより,同時に複数の TrackBack を受信したときでも,システム負荷が高くなり過ぎないようにしてみました.
制限事項
tb-rebuild.pl には以下の制限事項があります.
配布
毎度のことですが,tb-rebuild.pl の利用によって発生した損害等の責任は,私は負いませんので,各自の責任において利用してください.tb-rebuild.pl の著作権は主張しますが,改変,再配布等は自由にしていただいて構いません.
- tb-rebuild.pl (obsolete)
導入
tb-rebuild.pl を plugins ディレクトリに置いてください.次に,mt.cgi と同じディレクトリに「tb-rebuild」 *6というディレクトリを作成します.このディレクトリは,再構築待ちのエントリ ID 等を保持しますので,ウェブサーバの実行権限で書き込める必要があります.また,このディレクトリには,以下のファイル等を含めることはできません *7.
- .LOCK
- .WAIT
- 「.」で始らず,数字を含むファイル等
次に,lib/MT/App/Trackback.pm を修正します.
$app->rebuild_indexes( Blog => $blog )
or return $app->_response(Error =>
$app->translate("Rebuild failed: [_1]", $app->errstr));
上記の部分をコメントアウトしてください.
次に,同じ関数の最後にある return 文の前に以下を追加してください.
if ($entry) {
rebuildBackground($entry);
} else {
$app->rebuild_indexes( Blog => $blog )
or return $app->_response(Error =>
$app->translate("Rebuild failed: [_1]", $app->errstr));
}
以上で導入完了です.何度か TrackBack を送信して正しく動作することを確認しておいてください.
tb-rebuild.pl の処理概要
以下,興味がある人だけ読んでください.
通常は再構築を行う場所で子プロセス,孫プロセスを生成します.子プロセスはすぐに終了するので,Movable Type はすぐに次の処理に移ることができます.
孫プロセスでは,まず $TMP ディレクトリに再構築対象を書き込みます.そして,再構築中のプロセスがあるかどうかを調べます.なければ再構築を開始しますが,そうでない場合は,今度は待機中のプロセスがあるかどうかを調べます.待機中のプロセスがなければ,先の再構築プロセスが終了するまで待機します.もしすでに待機プロセスがあれば即座に終了します.再構築するはずだったエントリは,既に待機しているプロセスが再構築することになります.
再構築プロセスは TrackBack を受信したプロセスから独立して動作するため,この様な処理を行わない場合は,ウェブサーバが許容している同時アクセス数を超える再構築プロセスが存在する可能性がでてきます.しかし,上記処理によって大量の TrackBack を受信したときのシステム負荷を抑えているわけです.そしてそれは,tb-rebuild.pl を導入する前よりも負荷は低いはずです.
ちなみに,tb-rebuild.pl は本来プラグイン的な性質を持つものではないのですが,都合よく再構築前にロードされるので,plugins ディレクトリに放り込むようにしています.
おわりに
「my $app = new MT::App;」なんてことをしていますが,悪影響がないかをチェックしていません.多分大丈夫だとは思うのですが.ただ,これをしないとうまく動かないのです.DB とのコネクションの問題だと思います.識者の方のご意見をお待ちしています.
最近の更新履歴
- 2004-02-03 再構築開始後に Entry オブジェクト壊れてしまうようなので,他の処理が終わってから再構築するように上記ドキュメントを変更.(アドオン本体の修正は無し)
- 2004-01-26 全面的に書き換え.
- 2004-01-24 公開

コメントする