再構築不要化カスタマイズ(全SQL対応・その1)

2007年3月7日

Movable Type 3.3以降をご利用の方は、MT3.3専用版をお使いください。

詳細はこちらのページを参照してください。

Movable Typeの弱点として、「再構築」があげられます。
この問題を解決するカスタマイズとして、当Blogでは「Perl版ダイナミック・パブリッシング」を公開してきましたが、それを改良しました。

Movable Type 3.2になって、Movable Type本体のダイナミック・パブリッシング機能がPostgreSQLとSQLiteにも対応しました。
それに対抗(?)して、Perl版ダイナミック・パブリッシングも、PostgreSQLとSQLiteに対応させました(ただし、SQLiteでは機能制限があります)。

このカスタマイズを3日に分けて解説します。
今日は、Perl版ダイナミック・パブリッシングの概要を紹介します。

1.再構築の問題点

Movable Typeでは、メインページや各種アーカイブページをHTMLファイルとして静的に出力します。そのため、Blogを見る人にとっては、「ページがすばやく表示される」というメリットがあります。
しかし、Blogに何か変更を加えたときには、ページを作り直す(再構築する)ことが必要になります。
エントリーの数が少ない間はそれほど気になりませんが、エントリーの数が数百にもなると、再構築には相当な時間がかかるようになります。

また、すべてのページを静的に出力すると、その分だけサーバーのディスク容量を消費するという問題もあります。
しかし、古いエントリーのページはアクセスされる確率が低く、そういったページのためにディスク容量を消費するのは無駄が多いです。

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

2.Movable Type本体のダイナミック・パブリッシング機能とその問題点

Movable Type 3.1以降では、読者がBlogにアクセスした時点で動的にHTMLを出力する「ダイナミック・パブリッシング」機能が追加されています。

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

3.Perl版ダイナミック・パブリッシングのメリット

上記のような問題点を解決するために、「Perl版ダイナミック・パブリッシング」というものを作りました。

MT本体のダイナミック・パブリッシングとは異なり、従来のPerlの再構築処理をそのまま利用するため、ほとんどのプラグインが問題なく動作します。
そのため、静的な再構築から移行する場合、MT本体のダイナミック・パブリッシングに比べて、ハードルがぐっと低くなります。

これまで公開していたPerl版ダイナミック・パブリッシングでは、データベースにMySQLを使っていることが必要でした。
しかし、今回のバージョンアップでは、MySQLに加えて、PostgreSQLとSQLiteにも対応させました。
MT3.1x→MT3,2のバージョンアップの際に、データベースをSQLiteに変えた方も多いと思いますが、そういった方々にもお使いいただくことができます。

4.ページのキャッシュ機能

ページを動的に生成すれば、再構築が不要になるというメリットがあります。
しかし一方で、ページを表示するたびに動的に再構築を行うと、サーバーに負荷がかかるという問題があります。

そこで、Perl版ダイナミック・パブリッシングでは、一度再構築したページはキャッシュしておくようにすることができます。
同じページに再度アクセスがあったときには、キャッシュしておいたページを出力して、サーバーへの負荷を少なくすることができます。
なお、ページをキャッシュすると、その分だけディスク容量を消費しますが、キャッシュ容量の上限を設定することができるようにしてあります。

ただし、キャッシュの処理の際には、PHPでデータベースにアクセスします。
MySQLとPostgreSQLはPHPからアクセスすることができますが、SQLiteは現状のPHPでは対応が不十分です。
PHP5ならSQLiteに標準で対応していますが、多くのレンタルサーバーはPHP4がインストールされていて、その環境ではPHPからSQLiteにアクセスすることができません。
そのため、SQLiteでは、残念ながらページキャッシュ機能は使うことができません。

5.動作の速度

Perl版ダイナミック・パブリッシングでは、ページにアクセスされた時点で再構築(またはキャッシュから読み込み)の処理が行われます。
キャッシュをオンにしていれば、キャッシュされているページは、静的な場合とほぼ同等の速度で表示されます。

一方、キャッシュされていないページは、サーバーの性能によってページが表示されるまでの時間に差があります。
性能の良いサーバーであれば、ページにアクセスしてから1~2秒程度でページの表示が始まります。
しかし、性能が悪いサーバーだと、アクセスしてから5~10秒程度待たされることもあります。

なお、Lolipopのサーバーで、データベースとしてMySQLを使う場合、LolipopではMySQLのサーバーの台数が少なくて負荷が高いため、ページの表示がかなり重くなります。
LolipopでPerl版ダイナミック・パブリッシングをお使いになるなら、データベースをSQLiteにすることをお勧めします。
SQLiteであれば、ページにアクセスしてから1~2秒程度で表示が始まります。

6.プラグインの動作

前述したように、Perl版ダイナミック・パブリッシングでは、従来の再構築の処理を利用しています。
そのため、プラグインも大半は動作します。
当方のBlogでは、多数のプラグインを組み込んでいますが、すべて問題なく動作しています。

ただし、ページ分割プラグイン(MTPaginate)は動作しないことを確認しています。
その代わりに、Perl版ダイナミック・パブリッシング用のページ分割プラグインもご用意しています。
ページ分割を行いたい方は、そちらのプラグインをご利用ください。

7.システムの条件

Perl版ダイナミック・パブリッシングを動作させるには、以下の環境が必要です。

  • Movable TypeのデータベースをMySQL/PostgreSQL/SQLiteのいずれかで管理している(Berkeley DBは不可)
  • WebサーバーがPHPに対応している
  • .htaccessの設定を変えることができる