読者です 読者をやめる 読者になる 読者になる

遅延再構築プラグイン

何だかんだで、結局作った

静的生成と動的生成のメリットを取り入れたプラグイン

何をするプラグイン

遅くて待っていられない再構築の(あなたの)ストレスを軽減してくれます。

どんな人向け?

再構築待つのめんどい、鯖がへっぽこ、他のプラグイン沢山使ってる

対応バージョン

MTOS(MovableType Open Source) MTOS-4.1-en-boomer-r1114-20071213 での動作を確認しています。 それ以降ならおそらく問題ないでしょう。

検証はしてませんが、MTOSはほぼMT 4.xと同じ作りの様なので、多分、MT 4.xでも動きます。

必要なもの

mod_rewrite の使える環境、なくても工夫次第でなんとかなる

動作原理

MTはエントリを書いたり、テンプレートを変更するたびに、それらの変更がなされたHTMLファイルを作ります。 これが再構築というもので、エントリ数が増えると時間がかかります(静的生成)

でも普通は、ある瞬間に全てのページが用意されている必要は余りありません。 誰かがページを見ようとした時に、そのページだけ用意すればよいです。 リクエストがあった時に、そのページのコンテンツを構築するのが動的生成です。 (あなたが感じる)再構築にかかる時間はゼロになります。 ただ、毎回同じページ(新規エントリを書いた直後等はアクセスが多い)を処理するのは無 駄なので 構築した内容をデータベースにキャッシュするようなプラグインも世の中にはあります。 しかし、データベースを使ってるという事は、余計な仕事をしてるわけです。

じゃあ、どうするの?

動的生成と同じように、要求があった時にページを生成するようにしましょう。 これで、(あなたの)待ち時間は限りなくゼロに近づきます。

そして、最初の1回の誰かがページを見た時、その処理結果を本物のHTMLファイルとして保存しておきます。 次からそのページを参照した人は、予め静的生成されているのと同じように単にHTMLファ イルにアクセスするだけです。 再構築以上の仕事はしないので、負荷が増える事はありません。

このプラグインは、再構築のタイミングを先延ばしにする事によって、あなたのストレスを軽減します。 動的生成に見えるかもしれませんが、基本的には静的生成による再構築を行ってます

再構築による静的生成と全く同じ事をしてるので、再構築の時に使えるプラグインは全て有効です。

(公開キューとかあるよね?) (タイミング制御が出来ないじゃん、cronとか更にメンドイし)

ダウンロード、インストール

delaypublish.zip をダウンロードして、展開

mt-delay.cgi は分かりやすいところ($MT_HOME 直下とかで良い)に、plugins の中身は、$MT_HOME/plugins にコピー

mt-delay.cgiパーミッション変更を忘れずに

設定

MTは、エントリやファイルの情報を几帳面に管理してるので、勝手に横槍を入れる事が出来ません。 いくつかの設定を、遅延再構築のために設定する必要があります。

設定→ブログの設定→公開→公開方法 「アーカイブテンプレートのみダイナミックで構築する」に設定 (すべてダイナミックや、テンプレートごとに設定でも良い)

公開キュー、キャッシュ、条件付取得はいずれも使わない

テスト

ブログの公開パス、Blog ID、適当なエントリのURLをメモっておこう

例えば 公開パス: http://example.com/myblog/ Blog ID: 1 適当なエントリ: http://example.com/myblog/2008/01/06/test.html

設置した場所に合わせて http://example.com/mt-delay.cgi?blog_id=1&uri=/myblog/2008/01/06/test.html にアクセス そのエントリの内容が引けていれば、OK

次は、 $MT_HOMT/myblog/2008/01/06/test.html を削除して もう一度上のURLにアクセスしてみる。無かったファイルが、mt-delay.cgi によって作られている事を確かめよう。

mod_rewriteの設定

後は、実際に存在しないファイルにアクセスした時にこれが動くようにしてやれば良い。

$MT_HOME/myblog/.htaccess あたりに

  RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /mt-delay.cgi?blog_id=1&uri=/myblog/$1 [L]

とか書いておこう、ファイルが無かったらmt-delay.cgi に処理をさせるってスンポーだ

例によって、$MT_HOMT/myblog/2008/01/06/test.html を削除して、今度は http://example.com/myblog/2008/01/06/test.html にアクセスしてみよう (mt-delay.cgi ではなく) 少し待たされるが、エントリの内容が正しく表示されて、更にHTMLファイルもちゃんと出来てるはずだ。

再構築

ファイルがある限りはそれを使うし、無ければ勝手に再構築してくれるので やらなきゃいけないのは「古いファイルの削除」 だ。

プラグインを入れると、ダッシュボードのデザインメニューに「遅延再構築」っていう項目が増えているはずなので そこから、対象を選んで古いファイルの削除が出来る

とりあえずのやっつけ仕事なので(一応動く事は確認したけど)、アーカイブタイプを選んで削除する事しかしてない

シェルアクセスの出来る人は rm -r $MT_HOME/myblog/200? とかの方が速くてオススメ ただ、エントリ以外のもの(アップロードしたファイル)を巻き込まないように気をつけよう。 自分のサイトのディレクトリ構成はちゃんと把握しておかなきゃ。

こういう時便利

try & error でテンプレートを弄ったりしてる時 1つのエントリのHTMLファイルだけ削除して、アクセスすれば、その度に最新のテンプレートで再構築してくれる 他のエントリ(や、カテゴリーアーカイブ)には影響しないし 修正が完了しても、全ページ再構築なんかしないで、単に今あるファイルを消すだけ

アクセスする人が待たされる? サイトにもよるだろうけど、うちはログ見たら殆どのページをGoogle botがリビルドしてたよ

改良とか

シンプルなので、DoS対策とか考えてない。 ファイル名変えるだけで十分な気もするけど、環境変数使ってRewriteを経ないと動作しないようにするとか リバースプロキシでアクセス不可にしちゃうとか、好きにするといい。