ページにアクセスがあった時に再構築する

Movable Typeの最大のネックは、「再構築」だと思います。
記事が増えるにつれて、再構築の時間も長くなり、「再構築に何時間もかかる」というような方もいます。

再構築の負荷を分散する方法はいろいろありますが、手っ取り早い方法の1つとして、アルファサード有限会社が提供している「Rebuild On Demand」というプラグインを使う方法があります。
意外に知られていないようなので、紹介します。

1.Rebuild On Demandプラグインの仕組み

Rebuild On Demandプラグインは、「オンデマンド(On Demand)再構築」という機能をMovable Typeに追加します。
オンデマンド再構築は、以下のような仕組みで動作します。

  • 再構築が必要になったページを、その場で再構築するのではなく、サーバーから削除します。
  • サイトの利用者がページにアクセスした時点で、ページのファイルがサーバーにない場合は、そのページを再構築してファイルに保存し、かつブラウザに出力します。
  • サイトの利用者がページにアクセスした時点で、ページのファイルがサーバーにあれば、そのファイルがそのままブラウザに出力されます。

サーバーにないページは、動的に再構築される形になります。
そのため、サーバーにないページにたまたまアクセスした利用者には、やや重さを感じさせることになります。

しかし、一度生成されたページは、記事を追加するなどして、次に再構築が必要になるまでの間は、サーバーに存在し続けます。
同じページの2回目以降(次の再構築まで)のアクセスは、サーバーにあるファイルを返すだけになりますので、静的とほとんど同じ軽さになります。

再構築の負荷を分散しつつ、サイトの利用者の負担も極力少なくする仕組みで、合理的だと思います。

2.インストール

2-1.DynamicMTMLのインストール

Rebuild On Demandプラグインは、DynamicMTMLプラグインと組み合わせて使います。

まず、GithubからDynamicMTMLプラグインをダウンロードします。
ダウンロードしたファイルを解凍すると、「addons」と「plugins」のフォルダができますので、これらのフォルダをMovable Typeのインストール先ディレクトリにアップロードします。
そして、Movable Typeにログインし、データベースをアップグレードします。

2-2.Rebuild On Demandプラグインのインストール

次に、Rebuild On Demandプラグインをインストールします。

Githubからダウンロードします。
そのファイルを解凍すると、「plugins」のフォルダができますので、このフォルダをMovable Typeのインストール先ディレクトリにアップロードします。

3.設定

プラグインのインストールが終わったら、オンデマンド再構築を行いたいテンプレートで、その設定をオンにします。

テンプレートを編集する状態にし、「テンプレートの設定」の部分を開きます。
そして、「このテンプレートの再構築をリクエスト時にオンデマンド処理する」のチェックをオンにし、テンプレートを保存します。

オンデマンド再構築をオンにする

これ以後は、オンデマンド再構築をオンにしたテンプレートは、再構築が必要なタイミングになると、実際に再構築されるのではなく、出力されるべきファイルが削除されるだけの動作になります。
そして、そのテンプレートによるページに利用者がアクセスした時点で、実際の再構築が行われます。

4.オンデマンド再構築の効果

オンデマンド再構築では、ここまでで述べたように、従来の再構築の処理は、ファイルを削除するだけの処理になります。
そのため、再構築の(見た目上の)処理時間は大幅に短縮されます。

例えば、以下のような環境でテストを行ってみました。

  • 筆者のブログから記事を449件インポート
  • テーマはクラシックブログ
  • mt-config.cgiに「EntriesPerRebuild 200」の行を追加し、ブログ記事を200件ずつ再構築する

この状態で、ブログ記事アーカイブのみ再構築したところ、通常の状態(オンデマンド再構築をオフ)だと、再構築に1分11秒かかりました。
一方、オンデマンド再構築をオンにすると、再構築はわずか6秒で終了しました。

5.部分的に静的再構築できるようにしたい

アーカイブテンプレートでオンデマンド再構築をオンにすると、そのアーカイブのすべてのページがオンデマンド再構築で表示されるようになります。
しかし、一部のページは静的に出力し、それ以外のページはオンデマンドにしたい、ということもあります。
例えば、ブログ記事アーカイブのうち、最近1か月間の記事は静的に出力し、それより古い記事はオンデマンド再構築にする、といった場合です。
残念ながら、現状のRebuild On Demandプラグインには、このような機能はありません。

ただ、プラグインのコードを改良すれば、今述べたような機能を追加することは可能です。
今後このような機能を追加してみたいと思います。