ダイナミック・パブリッシングで perl のプラグインを利用する
Movable Type のダイナミック・パブリッシングを利用する際、外部で配布されているMTプラグインの適用にあたっては制約があります。このエントリーではこれを解消する方法をいくつか紹介したいと思います。
ダイナミック・パブリッシングのメリットとスタティック・パブリッシングの併用
Movable Type のダイナミック・パブリッシング機能を利用することで、再構築処理が大幅に削減、あるいは不要になることについて、ご存知の方も多いと思います。これを利用すればブログでよくみかける「再構築に時間がかかる」とか「500エラーになる」という問題が減るかもしれません。*1
ただし、ダイナミック・パブリッシングはページ表示時にデータベースから情報を収集し、再構築を行なうため、アクセスが多いとその分サーバに負荷がかかります。「キャッシュ機能」や「条件付きGET」を利用すればこの問題を解消することは可能ですが、本来的にはアクセスの多いメインページやRSSフィードはスタティック・パブリッシング(静的なファイルを出力)にすることが望ましいと考えます。
特にレンタルサーバを使用する場合、この条件が重要になってきます。ダイナミック・パブリッシングはページ表示を PHP で処理するのですが、PHP が CGI で稼動するレンタルサーバでは、モジュール版で動作する場合よりレスポンスがやや遅く、サーバにも負荷がかかります。詳細は「PHP における「モジュール版」と「CGI 版」の比較 + WordPress の適用例」をご覧ください。
Movable Type の良い点は、アーカイブ別にダイナミック・パブリッシング/スタティック・パブリッシングを選択できることです。
先に述べたように、メインページやRSSフィードはスタティック・パブリッシングにし、カテゴリー・アーカイブや日付アーカイブ等をダイナミック・パブリッシングにするといった、アクセスに応じて柔軟な対応が可能です。
ダイナミック・パブリッシングの問題
ここからが本題です。そういう訳で個人的には Movable Type のダイナミック・パブリッシング機能は非常に優れていると感じているのですが、利用するにあたっては問題がひとつあります。それは
- ダイナミック・パブリッシング対応のMTプラグインが少ない
ということです。ここで言う「MTプラグイン」は、変数タグ・コンテナタグ・条件タグといった、テンプレートに記述するMTタグを提供するものを指します。
ダイナミック・パブリッシングを行う場合、標準のMTタグは Perl で実装されたプログラムを処理するのではなく、PHP(Smarty)が動作します。Movable Type のインストールアーカイブに php/lib ディレクトリがあると思いますが、この配下にダイナミック・パブリッシング用のタグおよびグローバルアトリビュートのプログラムが配置されています。
したがって、MTタグを提供するプラグインをダイナミック・パブリッシングで利用する場合、標準のMTタグと同様に PHP の実装が条件となります(プラグインに php ディレクトリが存在すれば多分対応しています)。
現在、当サイトで公開している「Movable Type プラグイン一覧」で挙げているプラグインは 200 を越えていますが、多くのプラグインが対応していないのではないかと推測します(私自身然り)。またこれがダイナミック・パブリッシングがメジャーにならない要因のひとつでかもしれないと懸念しています。
前置きが長くなりましたが、この問題を解消する方法等についていくつか紹介したいと思います。同時にダイナミックパブリッシングに精力的に活動されているサイトも紹介させて頂きます。
1.MTIncludeタグを利用する
これは、ダイナミック・パブリッシングに対応していないMTタグを使ったリスト等を、一旦インデックス・テンプレートにモジュール(部品)として追加し、それをダイナミック・パブリッシングしたアーカイブから MTInclude タグ+ file 属性を利用して引き込むというテクニックです。
このテクニックは下記のサイトで詳しく紹介されています。
「WingMemo」さんのところではダイナミック・パブリッシングに関する記事が多く掲載されています。ダイナミック・パブリッシングを検討されている方の手助けになると思いますので是非ご利用ください。
なお、このテクニックで作成したインデックス・テンプレートは必ず「インデックス・テンプレートを再構築するときに、このテンプレートを自動的に再構築する」にチェックを入れてください。
試しに MTCollate を使った「最近のコメント」を出力してみたところバッチリでした。
2.PHP化されたプラグインを利用する
「あんちもん2.Lab」さんは、個人プロジェクトとして Perl 版プラグインをダイナミックパブリッシング対応にリファクタリング(PHPize)されているサイトです。
これまでにもいくつかの既存プラグインをダイナミック・パブリッシング対応にされており、先の MTInclude で対応できないケースもこのリファクタリングで解決することができます。個人的には大変期待しておりますので、「このプラグインをダイナミック・パブリッシング対応して欲しい!」とお願いすれば作ってもらえるかもしれません。*2
3.Perl 版ダイナミックパブリッシングを利用する
「The blog of H.Fujimoto」さんで配布されている、Perl 版のダイナミック・パブリッシングを利用することで、ダイナミック・パブリッシングに対応していないプラグインをそのまま利用することができます。
ダイナミックパブリッシングの今後
サイトを訪問する側からすればストレスなくページが表示されることが好ましいので、全ページをスタティック・パブリッシングとするのが望ましいのですが、大量の記事を有するサイトでの運営の効率化を考慮すると、ダイナミック・パブリッシングは今後益々有効な手段として利用されていくのではないでしょうか。
私自身、サイトのダイナミック・パブリッシング化を検討していますし(それ以前に3.3にアップグレードしなければですが)、冒頭に述べたモジュール版 PHP がレンタルサーバ界に普及することが、Movable Type に限らず、ページを動的生成するブログがスタティック・パブリッシングに近づくための重要な要素のひとつであると思います。
*1:サーバのスペックによっては解消しない場合もあります。
*2:元サイトの配布プラグインのライセンスによっては対応できないものもあります。
Fast Search でカテゴリーの絞込み検索をする
先週紹介した「Movable Type で高速検索を実現する Fast Search プラグイン」ではオプションとしてカテゴリーの絞込み検索を行うことができます。
このエントリーでは Fast Search の検索フォームにカテゴリー選択のプルダウンメニューを追加する方法をご紹介します。
プラグイン配布元ではカテゴリーで絞込みを行う場合は、検索フォームに、
<input type="hidden" name="category" value="5" />
というような input 属性を追加する説明がありますが、カテゴリー ID はプルダウンメニューから設定できるようにします。
1.デフォルトテンプレートの場合
リストの青色部分が Fast Search の検索フォームに追加した箇所です。
<div class="module-search module">
<h2 class="module-header">検索</h2>
<div class="module-content">
<form method="get" action="<$MTBlogURL$><$MTFastSearchScript>">
<input type="hidden" name="IncludeBlogs" value="<$MTBlogID$>" />
<label for="search" accesskey="4">ブログを検索: </label><br />
<input id="query" name="query" size="20" />
<select name="category">
<option value="0">全カテゴリーを検索</option>
<MTCategories>
<option value="<$MTCategoryID$>"><MTParentCategories glue=" > "><$MTCategoryLabel$></MTParentCategories></option>
</MTCategories>
</select>
<input type="submit" value="検索" />
</form>
</div>
</div>
2.公開テンプレートの場合
<div class="side">
<form method="get" action="<$MTBlogURL$><$MTFastSearchScript>">
<input type="hidden" name="IncludeBlogs" value="<$MTBlogID$>" />
<label for="search" accesskey="4">ブログを検索: </label><br />
<input id="query" tabindex="5" accesskey="t" name="query" size="20" value="" /><br />
<select name="category">
<option value="0">全カテゴリーを検索</option>
<MTCategories>
<option value="<$MTCategoryID$>"><MTParentCategories glue=" > "><$MTCategoryLabel$></MTParentCategories></option>
</MTCategories>
</select>
<input type="submit" tabindex="6" accesskey="s" value="Search" />
</form>
</div>
3.注意事項
サンプルで追加したプルダウンメニューは、サブカテゴリーの左側に、">" をセパレータとして親カテゴリーを表示していますが、現実的にはカテゴリー名全体が横に長くなる場合が少なくないと思われます。横に長くなり過ぎると、プルダウンメニューがサイドメニューからはみ出す可能性があります。
カテゴリー名がはみ出さないようにするには、サブカテゴリーのみ表示するように、
<option value="<$MTCategoryID$>"><MTParentCategories glue=" > "><$MTCategoryLabel$></MTParentCategories></option>
の部分を
<option value="<$MTCategoryID$>"><$MTCategoryLabel$></option>
に変更してください。
Movable Type で高速検索を実現する Fast Search プラグイン
ダイナミック・パブリッシングを利用して Movable Type の高速検索を実現する Fast Search プラグインを紹介します。
このプラグインは、3.2x および 3.3x の検索結果テンプレートで利用している MT タグを php で利用可能にしたもので、テキスト検索、3.3x ではタグ検索も可能になっています。実験した感想としては検索レスポンスが数倍向上します。
なおプラグイン適用条件として、下記を満たしている必要があります。
- Movable Type 3.2 or 3.3
- MySQL 4.0.1 以上
1.プラグインのダウンロード
下記のサイトにある「Dowmload Now」のリンクをクリックして、プラグインをダウンロード。非商用サイトは無償で寄付を受け付けています。商用サイトは $97.00 です。
2.プラグインのアップロード
まず解凍した時のディレクトリ構造は下の通りです。
/FastSearch
/php
/plugins
block.MTBlogResultFooter.php
:
modifier.google_highlight.php
/plugins
/FastSearch
/tmpl
fast_search.tmpl
widget_fast_search.tmpl
FastSearch.pl
/PluginNetwork
PluginNetwork.pl
これを次の通りにアップロードします。
- FastSearch/php/plugins 配下のファイルをインストールディレクトリの mt-dir/php/plugins に全てアップロード
- FastSearch/plugins をインストールディレクトリの mt-dir/plugins にフォルダごと全てアップロード。mt/plugins の下に FastSearch および PluginNetwork ディレクトリが配置されるようにしてください。
3.アップグレード
プラグインをアップロード後、管理ページにログインするとアップグレード画面が表示されます。
驚かずに粛々と作業を進めてください。
アップグレード完了後、管理ページに再度ログインします。
4.ダイナミックパブリッシングの設定
Fast Search プラグインを利用にするために、ダイナミックパブリッシングの設定を行います。ダイナミックパブリッシングをご利用でない(各ページをスタティックに出力している場合)、メインページや他のアーカイブページをダイナミックパブリッシングに変更する必要はありません。
ブログ別管理画面の[設定] - [公開]を選択し、「再構築オプション」を「テンプレート別に、スタティックHTMLもしくはダイナミック・パブリッシングを選択します」を選択します。これで「変更を保存」をクリックします。
この時、メインページのあるディレクトリにダイナミックパブリッシングを有効にするための .htaccess および templates_c ディレクトリが自動生成されます。
5.Fast Search 設定1(初期設定)
ブログ別管理画面の[設定] - [プラグイン]を選択し、一覧に表示されている「Fast Search」の右側にある「設定を表示」をクリックします。これで設定画面(下)が開きます。
まず「Enable Fast Search」をチェックしてプラグインを有効にしてください。
「Search Results Per Page」および「Enable Logging」の設定もこの時に同時に設定することができます。
設定後、「変更を保存」をクリックします。
6.Fast Search 設定2(検索結果表示用テンプレート生成)
再度、 プラグイン一覧に表示されている「Fast Search」の右側にある「設定を表示」をクリックします。そして「Click here to install the default Fast Search Template.」のリンクをクリックしてください。
これで Fast Search 検索結果表示用の特殊なインデックステンプレートが生成され、その画面に遷移します(すでに保存されているので「保存」をクリックする必要はありません)。
また前段の作業でダイナミックパブリッシングの設定をしているので、再構築オプション自動的に「このテンプレートをダイナミック・ページにする」にチェックがつきます。もし後からダイナミックパブリッシングの設定を行なった場合は、このテンプレートに対しダイナミックパブリッシングで動作する設定(=チェックボックスのチェック)を行なってください。
これがプラグインで用意されている検索結果画面テンプレートですが、3.3x の検索結果画面デフォルトテンプレート、あるいは当サイトで配布している検索結果画面テンプレートに丸ごと入れ替えても正常に動作します。
7.Fast Search 設定3(検索フォーム)
Fast Search 用のフォームは、既存の
<form method="post" action="<$MTCGIPath$><$MTSearchScript$>"
を
<form method="post" action="<$MTBlogURL><$MTFastSearchScript>"
に変更すればOKです。
またはプラグインから Widget を生成することもできます。その場合は先のプラグイン設定画面にある、「Click here to install the Fast Search Widget.」のリンクをクリックします。これでテンプレートモジュールとしての検索フォーム「Widget: Fast Search」が生成されます。

このテンプレートモジュールを Widget ではなく、MTInclude タグで引き込むこともできます。その場合は検索フォームを表示させたいテンプレートのサイドバー部分に下記の1行を追加します。
<$MTInclude module="Widget: Fast Search"$>
8.Fast Search 設定4(FastSearch Method)
プラグインの設定画面で、もうひとつ「FastSearch Method」というプルダウンメニューの選択による設定項目があり、それぞれ下記のような意味があります。
- FullText:MySQLに標準搭載されている全文検索インデックス
- Non-FullText:上記以外
- Fallback:FullText を試行し、NGであれば Non-FullText で実行
FullText が一番良さそうなのですが、環境によってはエラーが発生します(実験サイトで試したところ、正常に動作する時とそうでない時がありました)。
調べてみたところ、FullText での日本語の全文検索については制約があるようです(詳細は9項の関連記事参照)。また Fallback では FullText を試みますが、失敗した場合は FullText のエラーが画面に表示されてしまうので、FullText を選択してエラーが解消しない場合は Non-FullText を選択するのが無難でしょう(FullText の適切な設定方法があればご教示ください)。
これで Fast Search の検索フォームより検索を実行し、検索結果が正常に表示されれば完了です。
9.ダイナミック・パブリッシングのチューニング
これで検索処理は高速になりますが、Movable Type デフォルトの検索機能の「連続実行抑止時間」の設定はありません。その結果サーバへの負荷拡大が予想されます。モジュール版PHPであればまだ良いのですがCGI版PHPの場合はプログラム実行とみなされます(参考:PHP における「モジュール版」と「CGI 版」の比較 + WordPress の適用例)。
したがって、「Movable Type の再構築を不要にする「ダイナミック・パブリッシング」(その2:設定方法)」の3項で解説しているように、ページレベルのキャッシングや条件付きGETの設定し、サーバの負荷を少しでも軽減することをお勧めします。
なおタグ検索は有効と思われますが、テキスト検索では検索文字列が不定なため、どれほどの効果があるかは分かりません。
10.関連記事
Movable Type の再構築を不要にする「ダイナミック・パブリッシング」(その2:設定方法)
その2ではダイナミック・パブリッシングの具体的な設定方法を記します。前提条件を満たしていれば、さほど難しい設定はありません。
1.ダイナミック・パブリッシングの条件
1.1 データベース
まず、使用データベースに
- MySQL
- PostgreSQL
- SQLiteバージョン2
が利用されていることが必要です。
もし BerkeleyDB や SQLite を利用されているのであればデータベースの移行が必要になります。データベース移行については下記の記事が参考になるでしょう。
1.2 HTTPサーバ
.htaccess が利用できる必要があります。レンタルサーバであれば大体利用できる設定になっていると思いますが、自宅サーバで Apache をご利用であれば httpd.conf に以下のような記述を追加します。ディレクトリはご自身の環境にあわせてください。
<Directory /usr/local/apache/htdocs/mt> AllowOverride All </Directory>- リスト1 httpd.conf
IISをお使いの場合は、403と404のエラーに対して、mtview.phpへのURLを設定してください(とマニュアルに記載されています)。
2.ダイナミック・パブリッシングの設定方法
2.1 再構築オプションの変更
Movable Type の管理画面から[設定]-[公開]の「公開」欄にある「再構築オプション」から下記のいずれかを選択し、「変更を保存」をクリックします。
「アーカイブのみダイナミック・パブリッシングで出力します」を選択
![]()
「テンプレート別に、スタティックHTMLもしくはダイナミック・パブリッシングを選択します」を選択
![]()
なお、1.2項で説明した .htaccess は、上記を選択し「変更を保存」をクリックした時点で生成されます。
後者を選択した場合は、さらに各テンプレートの編集ページで「このテンプレートをダイナミック・ページにする」のチェックボックスをチェックします。チェックして保存すると、そのテンプレートがダイナミック・パブリッシングの対象になり、再構築ボタンが非表示になります。 |
インデックス・テンプレートはスクリーンショットのような選択画面が表示されますので、「このテンプレートをダイナミック・ページにする」にチェックをして保存すれば、下の「インデックス・テンプレートを再構築するときに、このテンプレートを自動的に再構築する」のチェックボックスは非表示になります。 |
2.2 テンプレート・キャッシュ・ディレクトリの作成
ブログのルート・ディレクトリに templates_c という名前で新しいディレクトリを作成し、パーミッションを777に設定します。ディレクトリを作成しないとページが正常に表示されません。
3.ダイナミック・パブリッシングの最適化
以下の設定を行うことでダイナミック・パブリッシングを最適化します。
3.1 ページ・レベルのキャッシング
その1で説明した通り、Movable Type ではページのキャッシュ機能があります。この機能を利用すれば、あるページに対するリクエストで、そのページがファイルとしてキャッシュされます(ファイル名は外部から認識できない文字列)。
キャッシングを有効にするには、ブログのルート・ディレクトリに cache という名前のディレクトリを作成し、パーミッションを777に設定します。
次に、Dynamic Site Bootstrapperテンプレート(mtview.php)に青色の行を加えます。
<?php include('<$MTCGIServerPath$>/php/mt.php'); $mt = new MT(<$MTBlogID$>, '<$MTConfigFile$>'); $mt->caching =true; $mt->view(); ?>- リスト2 Dynamic Site Bootstrapperテンプレート
設定後、保存・再構築します。
これを利用すれば、(多分)テンプレートの内容が変更されるまでこのキャッシュが利用されるので、スタティック・パブリッシングに近いスピードでページにアクセスすることができます。
キャッシュを利用することでディスクは消費しますが、パフォーマンスは向上します。キャッシュはサーバの環境にあわせて利用を検討してください。個人的にはディスクの余裕があれば利用されることを推奨します。
3.2 条件付きリクエスト
ページ・レベルのキャッシングと排他的に利用すると思われるのが、この「条件付きリクエスト」です。機能としては、ページに変更がない状態でリクエストを受け付けた場合、304 Not Modified(サーバ上のファイルの変更がないためブラウザのキャッシュを用いることを示す)を返却します。
この設定を行うには、Dynamic Site Bootstrapperテンプレート(mtview.php)に青色の行を加えます。
<?php include('<$MTCGIServerPath$>/php/mt.php'); $mt = new MT(<$MTBlogID$>, '<$MTConfigFile$>'); $mt->conditional =true; $mt->view(); ?>- リスト3 Dynamic Site Bootstrapperテンプレート
設定後、保存・再構築します。
ダイナミック・パブリッシングを行うか、304 を返却するかの元情報は、ブログのコメント・トラックバック・テンプレート等のタイムスタンプを利用しているようです。
Movable Type の再構築を不要にする「ダイナミック・パブリッシング」(その1:概要)
「Movable Type で再構築ができません」「500エラーが多発します」という記事をよくみかけますが、Movable Type には WordPress のようなページの動的生成、いわゆる「ダイナミック・パブリッシング」がバージョン 3.1 から標準搭載されており、これを利用することで再構築不要な環境にすることができます。
「ダイナミック・パブリッシング」とは、リクエストが発生するたびにHTMLページを動的に生成する機能です。ちなみに「再構築」は、エントリー本文やコメント・トラックバック等のデータをデータベースから読み出して、スタティックなHTMLページを生成することです。
当サイトではこれまで「ダイナミック・パブリッシング」について全く取り上げていなかったのですが、今後は少しずつ記事として取り上げていきたいと考えています。
というのは、現在発売されている某雑誌で「Movable Type はスタティックなHTMLページ生成しかできません」ということが書かれており、Movable Type のブログツールとしての著名度に比べ「ダイナミック・パブリッシング」についての認知度が低いのではないかと懸念した次第です(私もその一人だったかもしれませんが)。
※スタティックページ生成を、ここでは便宜上「スタティック・パブリッシング」と称します。
1.スタティック・パブリッシングとダイナミック・パブリッシングの比較
まずは概要ということで、スタティック・パブリッシングとダイナミック・パブリッシングの各評価項目について、表で比較してみました。
| 項目 | スタティック | ダイナミック | ダイナミック・パブリッシングを設定したページおよび管理画面 |
|---|---|---|---|
| 再構築 | 要 | 不要 | 「ページを再構築する」という作業がなくなります(「保存」ボタンはデータベースに変更を反映させるだけ)。 |
| 再構築による500エラー | あり | なし *1 | 再構築がなくなりますので、500エラーが発生しなくなります。 |
| ページ表示 | 早い | やや遅い | アクセス毎にPHPを実行してページを生成するため、その分時間を要します。*2 |
| ディスク容量 | エントリー数に比例して増加 | 少 | スタティックページを生成しないため、ディスクの消費が少なくなります。*3 |
| エントリー削除後のHTMLファイル | 残らない *4 | 残らない | スタティックなファイルを生成しないので、誤って公開してしまったエントリーもアクセスされなくなります。 |
| コメント・トラックバック処理 | やや遅い | 早い | コメント・トラックバック受信によるスタティックページ生成処理がなくなる分、処理が早くなります。 |
| テンプレートタグ関連のプラグイン | 利用できる | 利用できない | PHPで動作するため、当サイトで公開している「Movable Type プラグイン一覧」で掲載しているテンプレートタグ(<MTxxx> みたいなもの)が使えない場合があります。*5 *6 |
どちらを選択するかについては、ご利用のサーバ環境等に依存します。
2.Movable Type でのメリット
1項に記していない、Movable Type を利用する際における大きなアドバンテージは、ダイナミック・パブリッシングとスタティック・パブリッシングをテンプレート単位に選択できることです。したがって、リクエストの多いメインページやRSSフィードはスタティック・パブリッシング、比較的アクセスが落ち着いている(と思われる)アーカイブページはダイナミック・パブリッシングで運用することが望ましいでしょう。
*1:単純に「ダイナミック・パブリッシング」にすれば、再構築のストレスから解消できるという訳でもないようです。例えば、ロリポップではサーバ+DBのパフォーマンスの問題か、「ダイナミック・パブリッシング」が快適に動作しないケースがあるようですので、導入する前にレンタルサーバのサポートやネット上で情報を入手されることをお勧めします。
*2:キャッシュ機能を利用することで改善されます。
*3:キャッシュ機能を利用するとディスクはその分必要になります。
*4:オプション設定が必要。詳細は「Movable Type のエントリー削除でHTMLファイルも自動的に削除する」参照。
*5:プラグインを利用したい場合は、The blog of H.Fujimoto さんの「再構築不要化カスタマイズ(MT3.3専用版)」をお勧めします。
*6:テンプレートタグ関連のプラグインはPHPで作成すれば対応可能(通常のプラグインはPerl)です。ダイナミック・パブリッシング用プラグインはほとんど出回っていない状況ですが、中には対応しているものもあります。
後者を選択した場合は、さらに各テンプレートの編集ページで「このテンプレートをダイナミック・ページにする」のチェックボックスをチェックします。チェックして保存すると、そのテンプレートがダイナミック・パブリッシングの対象になり、再構築ボタンが非表示になります。
インデックス・テンプレートはスクリーンショットのような選択画面が表示されますので、「このテンプレートをダイナミック・ページにする」にチェックをして保存すれば、下の「インデックス・テンプレートを再構築するときに、このテンプレートを自動的に再構築する」のチェックボックスは非表示になります。

