ダイナミック・パブリッシングを利用すれば、テンプレートごとにブログ単位でスタティック・ページとダイナミック・ページを組み合わせて、ブログのパブリッシングとトラフィックのバランスを最適化できます。たとえば、サイトのメイン・ページのインデックスやRSSフィードのように、頻繁にリクエストのアクセスがあるページではスタティックに出力し、月別やカテゴリーのアーカイブなど、リクエストのアクセスが比較的少ないページにはダイナミック・ページを使う、などといったことができます。
ダイナミック・パブリッシングを利用する場合、データベースはMySQL、PostgreSQL、SQLiteバージョン2をお使いください。Berkeley DBやSQLiteバージョン3では動作しません。
ダイナミック・パブリッシングにはさまざまな利点があります。通常の更新方法の場合、スタティックなHTMLを作成するため、テンプレートなどを変更するたびに再構築の必要があります。しかし、ダイナミック・パブリッシングの場合は、テンプレートなどの変更がすぐに反映されます。大量のエントリーが存在するブログの場合、再構築の時間を大幅に削減できます。
さらに、ダイナミック・パブリッシングはエントリーの数だけHTMLファイルを生成するのではなく、リクエストごとに逐次ページを生成するため、ディスク・スペースの節約にもなります。たくさんのインデックス/アーカイブ・テンプレートを使用したい場合も、容量の心配をすることなしに構築できます。
ただし、リクエストのアクセスが多い場合、サーバーへの負荷が高くなります。そうしたページはスタティック・パブリッシングで公開すれば、負荷を軽減できます。ダイナミックとスタティックを適切に使い分けることで、円滑なシステム運営が可能になります。
ウェブ・サーバーとしてApacheを使用している場合、ダイナミック・パブリッシングのために.htaccessファイルを利用できるように設定する必要があります。Apacheの設定ファイルhttpd.confに以下の記述を追加します。
<Directory /usr/local/apache/htdocs/mt>
AllowOverride All
</Directory>
.htaccessファイルはステップ1でダイナミック・パブリッシングを使用する設定に変更した時点で自動的に生成されます。
IISをお使いの場合は、mtview.phpスクリプトをカスタムのエラー・ドキュメントとして使うように、ウェブ・ディレクトリを設定する必要があります。403と404のエラーに対して、mtview.phpへのURLを設定してください。
Movable Typeにログインして、ブログの設定(詳細モード)の公開タブに進み、再構築オプションでアーカイブのみダイナミック・パブリッシングで出力しますまたはテンプレート別に、スタティックHTMLもしくはダイナミック・パブリッシングを選択しますのどちらかを選択します。
後者を選択した場合は、さらに各テンプレートの編集ページでこのテンプレートをダイナミック・ページにするというチェックボックスにチェックすると、そのテンプレートがダイナミック・パブリッシングの対象になります。
ブログのルート・ディレクトリにtemplates_cという名前で新しいディレクトリを作成し、パーミッションを777(rwxrwxrwx)に設定します。
ダイナミック・ページを使うと、キャッシュされない各ページのビューには、そのページを構築するため、多くのデータベース・クエリー(問い合わせ)が発生します。
ウェブ・サーバーの性能とテンプレートの複雑度によって異なりますが、1秒もかからないこともあれば、数秒かかる場合もあります。以下は、ダイナミック・ページの処理速度を最適化するのに役立つヒントです。
メイン・インデックスで、表示するエントリーの数を減らしてみましょう。デフォルトで設定されている過去数日分の投稿を表示する代わりに、以下のような一定数の投稿を表示する方法を使います。
<MTEntries lastn="10">
これはエントリーの数を最新のものから10件表示する記述です。このパラメーターは任意の値に調整できます。
テンプレート・タグは、種類によっては、実行時間がより長くかかるものがあります(コンテンツを生成するクエリーは、通常より時間がかかりまます)。たとえば<MTArchiveList>タグや<MTSubCategories>タグなどです。
ダイナミック・パブリッシングを最適化する別の方法は、ページ・レベルのキャッシングを有効にすることです。この機能によって、ダイナミック・パブリッシングは、1つのリクエストから次のリクエストに移行する間、ファイル・システムにキャッシュされるので、スタティック・ページに近いスピードが得られます。長期的に見ると、これはディスク・スペースをより多く消費しますが、性能上の利点があります。ページ・レベルのキャッシングをオンにするには、ブログのルート・ディレクトリにcacheという名前で新しいディレクトリを作成し、パーミッションを777(rwxrwxrwx)に設定する必要があります。次に、Dynamic Site Bootstrapperテンプレートに次の行を加えます。
$mt->caching =true;
この行は$mt->view();の行の上に加えてください。この行を削除すると、キャッシング・オプションが無効になります。
修正後に再構築すると、ダイナミック・ページを表示するときに、作成したキャッシュ・ディレクトリ内にキャッシュするようになります。キャッシュされたあとは、ブログ・コンテンツがそのキャッシュされたページより新しい場合、またはリクエストを受けた場合に限り、1ページずつ再構築されます。
ダイナミック・ページに、条件付きリクエスト(HTTP 304応答)を設定できます。通常、ページがダイナミックに生成される場合、ページは条件なしで生成されます。中にはこうした状態が適している場合があるため、条件付きリクエストはデフォルトでオフになっています。条件付きリクエストはDynamic Site Bootstrapperテンプレートに次の行を加えます。
$mt->conditional =true;
この行は$mt->view();の行の上に加えてください。条件付きリクエストに関連付けられたタイムスタンプはブログが最後に変更された時間です。変更とは、コメント、トラックバック、テンプレートなど、ブログのどの部分に対しての変更も意味します。さらに機能をアップして、条件付き動作を条件付きで設定できます。以下はフィードのページで、この機能をオンにする記述です。
if(preg_match('/(index|atom)\.(rss|xml|rdf)/',
$_SERVER'REQUEST_URI')){
$mt->conditional =true;
}
ダイナミック・パブリッシング・モードはPHPプラグインもサポートします。Perlプラグインと比べると、アーキテクチャは異なりますが、似ている点もあります。PHPベースのダイナミック・パブリッシング・エンジンの主要なコンポーネントは、Smartyテンプレート・パッケージとezSQLライブラリの2つです。
Movable Typeのメイン・ディレクトリにあるphpディレクトリには、ダイナミック・パブリッシング・エンジンに関連するすべてのファイルとリソースがあります。
mt/php/
lib/ MT標準のタグとモジュール
extlib/ サードパーティ・パッケージ(ezSQLとSmarty)
plugins/ サードパーティMT/PHPプラグイン
プラグインのファイルは、pluginsディレクトリの中に入れてください。MT/PHPプラグインを開発するには、Smarty用のプラグインを作成する方法に精通している必要があります。MT/PHPプラグインにおいて、カスタムblockはコンテナ・タグを、カスタムfunctionは変数タグを、およびカスタムmodifierはグローバル・フィルターを加えるためのベースとなります。
カスタム変数タグを実装するプラグイン例です。
<?php
function smarty_function_MTServerUptime($args, &$ctx){
$data = shell_exec('uptime');
return $data;
}
?>
Uptime: <$MTServerUptime$>
コンテナ・タグを実装する例です。
<?php
function smarty_block_MTLoop($args, $content, &$ctx, &$repeat)
{
if(!isset($content)){
$i = 1;
} else {
$i = $ctx->stash('i_value')+ 1;
} if($i <= 5){
$repeat =true;
} else {
$repeat = false;
}
$ctx->stash('i_value', $i);
return $content;
}
?>
<?php
function smarty_function_MTLoopIValue($args, &$ctx){
return $ctx->stash('i_value');
}
?>
条件タグは、コンテナ・タグの一種です。以下をblock.MTEntryIfTitle.phpとして作成します。
<?php
function smarty_block_MTEntryIfTitle($args, $content, &$ctx,&$repeat){
if(!isset($content)){
$e = $ctx->stash('entry');
$title = $e'entry_title';
return $ctx->_hdlr_if($args, $content, $ctx, $repeat,trim($title)!= '');
} else {
return $ctx->_hdlr_if($args, $content, $ctx, $repeat);
}
}
?>
なお、条件タグは、そのタグ名にIfを含め、<MTElse>コンテナ・タグと共に正しく機能するようにする必要があります。
グローバル・フィルターは、Smartyの用語では、modifier(修飾子)と呼ばれています。modifierは簡単に作成できます。以下をphp/plugins/modifier.rot13.phpとして作成します。
<?php
function smarty_modifier_rot13($s, $arg){
// str_rot13はPHP 4.2.0以降で使用可能です。
return str_rot13($s);
}
?>
このフィルターは以下のように使います。
<$MTEntryTitle rot13="1"$>
$ctx変数へアクセスする必要がある場合は、グローバルの$mt変数を通してアクセスできます。$mt変数は、テンプレート・コンテキスト(Smartyオブジェクト)を返すメソッド名の付いたコンテキストを持ちます。以下のサイトも参照してください。