ダイナミック・パブリッシングを利用すれば、テンプレートごとにブログ単位でスタティック・ページとダイナミック・ページを組み合わせることで、ブログのパブリッシングとトラフィックのバランスを最適化できます。例えば、サイトのメイン・ページのインデックスやRSSフィードのように、頻繁にリクエストのアクセスがあるページではスタティックに出力し、月別やカテゴリーのアーカイブなど、リクエストのアクセスが比較的少ないページにはダイナミック・ページを使う、などといったことができます。
ダイナミック・パブリッシングには様々な利点があります。スタティックなHTMLを作成する通常の更新方法の場合、テンプレートなどを変更するたびに再構築の必要がありますが、ダイナミック・パブリッシングの場合は変更がすぐに反映されます。大量のエントリーが存在するブログの場合、再構築の時間を大幅に削減できます。
さらに、ダイナミック・パブリッシングはエントリーの数だけHTMLファイルを生成するのではなく、リクエストごとに逐次ページを生成するため、ディスクスペースの節約にもなります。たくさんのインデックス/アーカイブ・テンプレートを使用したい場合も、容量の心配をすることなしに構築できます。
ただし、リクエストのアクセスが多い場合、サーバーへの負荷が高くなります。そうしたページはスタティック・パブリッシングで公開すれば、負荷を軽減できます。ダイナミックとスタティックを適切に使い分けることで、円滑なシステム運営が可能になります。
Movable Typeの必要条件に加えて、ダイナミック・パブリッシングには以下の要件が必要です。
ダイナミック・パブリッシングはリレーショナルデータベースの処理速度と即応性を必要とします。
バージョンを満たすだけでなく、使用するデータベースと接続できるようにコンパイルされている必要があります。
Apacheを利用する場合、「mod_rewrite」モジュールの利用を推奨しますが、必須ではありません。
HINT データベースとしてMySQLを使用する場合、ダイナミック・パブリッシングはmysqli拡張サポートには対応していないため、標準のmysql拡張を有効にしてコンパイルしてください。
ウェブ・サーバーとしてApacheを使用している場合、ダイナミック・パブリッシングのために「.htaccess」ファイルを利用できるように設定する必要があります。Apacheの設定ファイル「httpd.conf」に以下の記述を追加します。
例:ブログのルートディレクトリが「/usr/local/apache/htdocs/mt」の場合<Directory /usr/local/apache/htdocs/mt> AllowOverride All </Directory>
.htaccessファイルはステップ1でダイナミック・パブリッシングを使用する設定に変更した時点で自動的に生成されます。
Internet Information Serverをお使いの場合は、「mtview.php」スクリプトをカスタムのエラー・ドキュメントとして使うように、ウェブ・ディレクトリを設定する必要があります。その際は、「403」と「404」のエラーに対して設定してください。
Movable Typeの公開の設定ページに移動し、[再構築オプション]から[アーカイブのみダイナミック・パブリッシングで出力します]または[テンプレート別に、スタティックHTMLもしくはダイナミック・パブリッシングを選択します]を選択します。
後者を選択すると、各テンプレートの編集ページに[このテンプレートをダイナミック・ページにする]というチェックボックスがあるので、これを選択する必要があります。
ブログのルートディレクトリに「templates_c」という名前で新しいディレクトリを作成し、パーミッションを「777(rwxrwxrwx)」に設定します。
ダイナミック・ページを使うと、キャッシュされない各ページのビューには、そのページを構築するため、多くのデータベース・クエリー(問い合わせ)が発生します。
ウェブ・サーバーの性能とテンプレートの複雑度によって異なりますが、1秒もかからないこともあれば、数秒かかる場合もあります。以下は、ダイナミック・ページの処理速度を最適化するのに役立つヒントです。
メイン・インデックスで、表示するエントリーの数を減らしてみましょう。デフォルトで設定されている、過去数日分の投稿を表示する代わりに、以下のような一定数の投稿を表示する方法を使います。
<MTEntries lastn="10">
これはエントリーの数を最新のものから「10」件表示する記述です。このパラメータは任意の値に調整できます。
MTタグの中にはほかのタグに比べ、実行時間がより長くかかるものがあります(コンテンツを生成するクエリーは、通常より時間がかかりまます)。例えば<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オブジェクト)を返すメソッド名の付いたコンテキストを持ちます。また、以下のサイトを参照してください。