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サーバーに残っています。必要に応じて削除することができます。









コメントはスレッド表示になっています。
また、スレッドの先頭のコメントに対する返信には、先頭に矢印を表示しています。
初めまして。「亜細亜ノ蛾」の管理人です。
これはすごいですね!!まだテスト中ですが、Xreaのサーバーで正常に動作しているようです。
昨日、偶然このサイトの存在を知ったのですが、これからも読ませていただきますね。
──ところで、本文中の
> 出力先ファイル名を「dynamic-init.pl」にして、
は、「dynamic_init.pl」にしないと動きませんでしたよ。
>asiamothさん
こんにちは。
Perl版ダイナミック・パブリッシングをご利用いただき、ありがとうございました。
また、文中の間違いを指摘していただき、ありがとうございました。
こんにちは。
今ごろ気が付いたのですが、mt-dynamic使用時、「下書き」状態の記事が、「月別アーカイブ」「カテゴリアーカイブ」で表示されてしまいます。メインインデックスでは表示されません。
mt-dynamic側のバグでしょうか?
どこかで、MT側の不具合として上記のような現象を見た気もするのですが……。
よろしければ、情報をお願いします。
>aziamothさん
こんにちは。
不具合をご指摘いただき、ありがとうございます。
不具合を修正したものをアップロードしましたので、差し替えてお使いください。
mt-dynamicを今回導入させていただきました。
今までのプラグインも、ほぼそのまま使えるので助かってます。
ページ分割のプラグインもいただきました。
どうもありがとうございました。
>さっちんさん
こんにちは。ご利用いただきありがとうございます。
なお、現状ではページにアクセスがあったら常に動的生成するようにしていますが、ページをキャッシュして、動的生成を必要最小限にする機能を追加しようと考えています。
mt-dyanamicを導入/設定したところ、動的に生成されたページがうまく表示されないで困っています。
『./phptemp/0090201933.html』とだけページに表示されてしまいます。
CGIに詳しくないので、コードを追ってみたのですが、いまひとつわからずに途方にくれています。
お手数ですが、何かよき方法がありましたら、教えてください。
>さ・そん・ぼんさん
こんにちは。
間違っているところは大体予想がつきますが、それ以前にこのバージョンは古いので、最新のものをお使いください。
http://www.h-fj.com/blog/archives/2005/08/25-171138.php
バージョンアップしました。ありがとうございます。結局、サーバがPHP対応でないために、./phptemp~と表示されていたもようです。
ちなみに、ページの生成は、うまくできているので、そのページを表示するようにしたいのですが、どのような方法がよろしいのでしょうか。
>さ・そん・ぼんさん
こんにちは。
サーバがPHPに対応していなければ、ダイナミック・パブリッシング自体をオンにすることができないはずです。
どこのサーバをお使いでしょうか?
お世話になります。
これまでダイナミック・パブリッシングを使っていましたが、Tagwireプラグインを入れるとダイナミック・パブリッシングが使えないので、なんとかしたいと情報を探していてここに来ました。
こちらと「再構築不要化カスタマイズ(セキュリティホール修正)」を読み、試させていただきましたが、ダイナミックパブリッシングした部分に移ると
Parse error: parse error, unexpected T_STRING in /usr/local/apache/htdocs/blog/tenere/mt-dynamic.php on line 10
とエラーがでます。
MySQL接続の設定の$dbhost = "";という部分だと思いますが、理由がわかりません。
もし間違っている点がわかりましたらお教えください。
すみません。
ページキャッシュ機能のある新しいほうでもう一度試してみます。