再構築を不要にするカスタマイズ(Perl版ダイナミック・パブリッシング)

2005年12月19日 MySQL/PostgreSQL/SQLite全対応版を公開しました。こちらをお使いください。

Movable Typeでは、メインページや各種アーカイブページをHTMLファイルとして静的に出力します。そのため、Blogを見る人にとっては、「ページがすばやく表示される」というメリットがあります。

しかし、それが原因でBlogを頻繁に再構築することが必要になります。
エントリーの数が少ない間はそれほど気になりませんが、エントリーの数が数百にもなると、再構築には相当な時間がかかるようになります。

また、そのような状況になると、コメントやトラックバックを受けたときに、処理に時間がかかりすぎて、CGIが500エラーを起こしてしまうこともよくあります。
この問題を解決するには、静的にHTMLファイルを出力するのではなく、読者がページにアクセスしたときに動的にHTMLを作り出すようにします。

Movable Type 3.1以降では、動的にHTMLを出力する「ダイナミック・パブリッシング」機能が追加されています。
ただ、ダイナミック・パブリッシングはPHPが使われている一方、Movable Type本体はPerlで作られています。
そのため、「ダイナミック・パブリッシングでは、テンプレートタグを拡張するプラグインが使えなくなる」という致命的な欠点があります。
また、BlogをPHP化してモジュールに分けていると、その部分も動作しなくなるという問題があります。
これらの点から、ダイナミック・パブリッシングはあまり使われていません。

ダイナミック・パブリッシングでは、速度を上げるためにPHPが使われています。しかし、従来のPerlの枠組みでも、速度は落ちますが、HTMLを動的に作り出すことは可能です。
Perlの枠組みを利用することで、従来のプラグインをほぼそのまま使うことができます。また、PHP化していてもほぼそのままで動作させることができます。

そこで、それを実際に行って、再構築を不要にできるようにしてみました。
ダイナミック・パブリッシングに比べるとやはり速度はやや遅いですが、使い物にならないということはなく、実用的に使える感じの速度で動作しました。

ちなみに、ロリポップのサーバーで、エントリーが約600個、コメントとトラックバックが約900個という環境を作って、MTの標準のテンプレートで表示をテストしてみました。
その状況で、メインページは3~5秒で表示され、個別アーカイブページは1~2秒で表示されています。
また、コメントやトラックバックを受信したときの処理も、5~10秒程度で終わりました。
さらに、XREAのサーバーでもテストしてみましたが、こちらはロリポップよりも高速に動作し、ほぼストレスを感じないレベルでした。

ただし、このカスタマイズでは、ダイナミック・パブリッシングの枠組みを応用します。そのため、以下の条件を満たしていることが必要です。

・エントリー等のデータをMySQLに保存するようにしている(Berkley DBでは不可)
・.htaccessを設定することができる

また、テンプレートやプラグインの中で、動作しないものもあり得ます。
ちなみに、ページ分割(MTPaginate)のプラグインは、一部を書き換えないとうまく動作しませんでした。
ただ、MTPaginateは、動作の仕組み上、このカスタマイズと組み合わせるのには向いていません。
このカスタマイズに適したページ分割プラグインも作りましたので、後日公開します。

このカスタマイズの導入手順は以下の通りです。

●1.ファイルのダウンロードと設置
以下のリンクをクリックして、ファイルをダウンロードします。

新バージョンで上書きしましたので、リンクは削除しました

ファイルを解凍すると、「mt-dynamic.cgi」と「mt-dynamic.php」の2つのファイルができます。
BlogをPHP化していない方は、「mt-dynamic.cgi」だけを、Blogの出力先ディレクトリ(Blogの設定ページの「ローカルサイトパス」)にアップロードします。
一方、BlogをPHP化している方は、「mt-dynamic.cgi」と「mt-dynamic.php」の両方を、Blogの出力先ディレクトリにアップロードします。
また、どちらの場合も、「mt-dynamic.cgi」のパーミッションを実行可能に変えます(一般には755)。
さらに、PHPをCGIとして動作させるサーバーでは(例:さくらインターネット)、「mt-dynamic.php」のパーミッションも実行可能に変えます。

●2.初期化用テンプレートの作成
次に、インデックステンプレートを新規作成し、出力先ファイル名を「dynamic_init.pl」にして、テンプレートの内容として以下を入力します。

package Dynamic_Init;

$index_file = 'index.html';
$error404 = '';
$use_php = 0;

$mt_dir = '<$MTCGIServerPath$>';

1;


ただし、上記の3~5行目は、以下に従って書き換えます。

・3行目「$index_file = 'index.html';」
「index.html」の部分を、Blogのトップページのファイル名に合わせて変えてください。例えば、BlogをPHP化していて、トップページのファイル名を「index.php」にしている方だと、以下のように書き換えます。

$index_file = 'index.php';

・4行目「$error404 = '';」
ページが見つからない場合(URLの入力ミスなど)に、何かメッセージを表示するようにしたい場合は、上の文でそのページのURLを指定します。
例えば、ページが見つからないときに、「http://www.hogehoge.com/404.html」を表示するようにするには、上の文を以下のように変えます。

$error404 = 'http://www.hogehoge.com/404.html';

なお、ここにURLを指定しない場合は、エラーがあると、「ご指定のアドレスのページは見つかりませんでした。」というメッセージが表示されます。

・5行目「$use_php = 0;」
BlogをPHP化している場合は、「$use_php = 1;」に変えてください。

ここまでが終わったら、このテンプレートを保存し、再構築しておいてください。

●3.ダイナミック・パブリッシングをオンにする
Movable Typeの管理画面(mt.cgi)に入り、再構築を不要にしたいBlogで、テンプレート編集の画面を開きます。
その画面の右上の方に「再構築オプション」という部分がありますが、そこを「テンプレート毎に個別に選択」をオンにします。
これで、ダイナミック・パブリッシングがオンの状態になります。

●4..htaccessファイルの編集
3.の作業が終わると、Blogの出力先のディレクトリに、「.htaccess」というファイルができます。
この.htaccessファイルをいったんダウンロードして、メモ帳等で開きます。

その中に、「/○○/mtview.php」という部分が4箇所あります(○○はBlogの出力先ディレクトリ)。それらすべての「mtview.php」を、以下のように書き換えます。

BlogをPHP化していない場合 → mt-dynamic.cgi
BlogをPHP化している場合 → mt-dynamic.php

書き換えが終わったら、.htaccessファイルを元の場所に再度アップロードします。

●5.各テンプレートの設定
テンプレートの編集画面で、動的に出力したいテンプレートを開きます。
そして、画面の右上にある「このテンプレートをダイナミック・ページにする」のチェックをオンにします。

●6.Blogの再構築
ここまでの作業がすべて終わったら、Blog全体を再構築します。
5.の設定を行ったページが正しく表示されれば、設置は終わりです。
これ以後も、テンプレートを新規作成した時には、Blogの再構築を行ってください。

なお、ここまでの設定をすると、以前のHTMLファイルは不要になります。
それらのファイルは、拡張子に「.static」が追加された状態で、Webサーバーに残っています。必要に応じて削除することができます。