お知らせ

ブログ簡単パワーアップ FC2ブログスーパーカスタマイズテクニック2008年1月11日

拙著新刊の「ブログ簡単パワーアップ FC2ブログスーパーカスタマイズテクニック」が発売されました。
FC2ブログのさまざまなカスタマイズ方法を解説しています。
FC2ブログユーザーの皆様はぜひお買い求めください。

他にも多数書籍を執筆しています。
こちらもぜひご覧ください。

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

| コメント(12) | トラックバック(3)

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

トラックバック(3件)

このブログ記事を参照しているブログ一覧: 再構築を不要にするカスタマイズ(Perl版ダイナミック・パブリッシング)

このブログ記事に対するトラックバックURL: http://www.h-fj.com/mt/mt-tb.cgi/207.

» mt-dynamicの導入(CEFA::Blog)からのトラックバック

壱さんにmt-dynamicというプラグインを紹介して頂きました。一気にダイナミック・パブリッシングへ移行してしまいます。 続きを読む

» MTの動的生成でperlプラグインも動作する「mt-dynamic.cgi」(亜細亜ノ蛾 - Weblog)からのトラックバック

「MTの動的生成はperl版プラグインが動作しない」という常識を打ち破るCGI、「mt-dynamic」の紹介。「再構築時間の長さが気になる」というMovabl... 続きを読む

» mt-view.cgi でページの分割(hPod)からのトラックバック

MT::App::Viewer を少々改造してみた。その結果、カテゴリー・アーカイブだけではなく、メインページでも、パラメータ 'limit' と 'of... 続きを読む

コメント(スレッド12件,コメント12件)

コメントはスレッド表示になっています。
また、スレッドの先頭のコメントに対する返信には、先頭に矢印を表示しています。

No.1 asiamoth : (無題)

初めまして。「亜細亜ノ蛾」の管理人です。
これはすごいですね!!まだテスト中ですが、Xreaのサーバーで正常に動作しているようです。
昨日、偶然このサイトの存在を知ったのですが、これからも読ませていただきますね。
──ところで、本文中の

> 出力先ファイル名を「dynamic-init.pl」にして、

は、「dynamic_init.pl」にしないと動きませんでしたよ。

No.2  : (無題)

>asiamothさん
こんにちは。
Perl版ダイナミック・パブリッシングをご利用いただき、ありがとうございました。
また、文中の間違いを指摘していただき、ありがとうございました。

No.3 asiamoth : (無題)

こんにちは。
今ごろ気が付いたのですが、mt-dynamic使用時、「下書き」状態の記事が、「月別アーカイブ」「カテゴリアーカイブ」で表示されてしまいます。メインインデックスでは表示されません。
mt-dynamic側のバグでしょうか?
どこかで、MT側の不具合として上記のような現象を見た気もするのですが……。
よろしければ、情報をお願いします。

No.4  : (無題)

>aziamothさん
こんにちは。

不具合をご指摘いただき、ありがとうございます。
不具合を修正したものをアップロードしましたので、差し替えてお使いください。

No.5 さっちん : (無題)

mt-dynamicを今回導入させていただきました。
今までのプラグインも、ほぼそのまま使えるので助かってます。
ページ分割のプラグインもいただきました。
どうもありがとうございました。

No.6  : (無題)

>さっちんさん
こんにちは。ご利用いただきありがとうございます。

なお、現状ではページにアクセスがあったら常に動的生成するようにしていますが、ページをキャッシュして、動的生成を必要最小限にする機能を追加しようと考えています。

No.7 さ・そん・ぼん : (無題)

mt-dyanamicを導入/設定したところ、動的に生成されたページがうまく表示されないで困っています。
『./phptemp/0090201933.html』とだけページに表示されてしまいます。
CGIに詳しくないので、コードを追ってみたのですが、いまひとつわからずに途方にくれています。
お手数ですが、何かよき方法がありましたら、教えてください。

No.8  : (無題)

>さ・そん・ぼんさん
こんにちは。
間違っているところは大体予想がつきますが、それ以前にこのバージョンは古いので、最新のものをお使いください。

http://www.h-fj.com/blog/archives/2005/08/25-171138.php

No.9 さ・そん・ぼん : (無題)

バージョンアップしました。ありがとうございます。結局、サーバがPHP対応でないために、./phptemp~と表示されていたもようです。
ちなみに、ページの生成は、うまくできているので、そのページを表示するようにしたいのですが、どのような方法がよろしいのでしょうか。

No.10  : (無題)

>さ・そん・ぼんさん
こんにちは。

サーバがPHPに対応していなければ、ダイナミック・パブリッシング自体をオンにすることができないはずです。
どこのサーバをお使いでしょうか?

No.11 jujube Author Profile Page: (無題)

お世話になります。

これまでダイナミック・パブリッシングを使っていましたが、Tagwireプラグインを入れるとダイナミック・パブリッシングが使えないので、なんとかしたいと情報を探していてここに来ました。
こちらと「再構築不要化カスタマイズ(セキュリティホール修正)」を読み、試させていただきましたが、ダイナミックパブリッシングした部分に移ると
Parse error: parse error, unexpected T_STRING in /usr/local/apache/htdocs/blog/tenere/mt-dynamic.php on line 10
とエラーがでます。
MySQL接続の設定の$dbhost = "";という部分だと思いますが、理由がわかりません。
もし間違っている点がわかりましたらお教えください。

No.12 jujube Author Profile Page: (無題)

すみません。
ページキャッシュ機能のある新しいほうでもう一度試してみます。

コメントする

管理者のみにコメントを送信したい場合は、「コメントを秘密にする」のチェックをオンにしてコメントを送信するか、メールフォームからメールをお送りください。

ブログ全体の感想など、この記事に直接に関係しないコメントは、ゲストブックにお気軽に投稿してください。


アーカイブ

ブログパーツ

ステータス