Movable Type 3.1のダイナミック・パブリッシングによって、テンプレートごとに、スタティック・ページをダイナミック・ページと組み合わせて作成することができます。 そして、ブログのパブリッシングとトラフィックのバランスを取ることができます。 サイトのインデックスやフィードのように頻繁にリクエストされるページでは、スタティック・ページの生成をオンにし、月ごとに更新するページや、個人的なページ、アーカイブのページなどには、ダイナミック・ページを使うといったことが可能になります。 この機能は、手動でファイルを再構築する手間を完全に省きます。たとえば、アーカイブ・テンプレートのデザインを更新する際に、サイトのデザインは、あなた自身が再構築しなくても、直ちに更新されるようになります。
Movable Typeの必要条件に加えて、ダイナミック・パブリッシング・オプションには、以下の要件が必要です。
ダイナミック・パブリッシングには、リレーショナル・データベースの処理速度と即応性を必要とします。 したがって、Berkeley DBはサポートされません。 (PostgreSQLおよびSQLiteのサポートを予定していますが、3.1ではまだ未対応です。)
さらに、インストールするPHPは、あなたのデータベースと連携するようにコンパイルされている必要があります。
Apache を利用する場合、 mod_rewrite モジュールの利用を推奨しますが、必須ではありません。
Movable Typeの「テンプレート」パネルに行き、「テンプレート構築の設定」メニューから、「アーカイブ・テンプレートだけをダイナミックに構築する」または「テンプレートごとに構築の設定を指定する」を選択します。 後者を選択すると、必要な各テンプレートを編集して「このテンプレートのダイナミック構築をオンにする」を選択する必要があります。
ブログのルート・ディレクトリにtemplates_cという名前で新しいサブディレクトリを作成します。 ディレクトリに777のパーミッションを設定します。
ブログ・ルート・ディレクトリに、ダイナミック・ページのリクエストを扱う.htaccessファイルを作成する必要があります。 このファイルは以下のような内容です。
# Disable fancy indexes, so mtview.php gets a chance... Options ?Indexes +SymLinksIfOwnerMatch <IfModule mod_rewrite.c> # The mod_rewrite solution is the preferred way to invoke # dynamic pages, because of its flexibility. # Add mtview.php to the list of DirectoryIndex options, listing it last, # so it is invoked only if the common choices aren't present... <IfModule mod_dir.c> DirectoryIndex index.php index.html index.htm default.htm default.html default.asp /mtview.php </IfModule> RewriteEngine on # don't serve mtview.php if the request is for a real directory # (allows the DirectoryIndex lookup to function) RewriteCond %{REQUEST_FILENAME} !-d # don't serve mtview.php if the request is for a real file # (allows the actual file to be served) RewriteCond %{REQUEST_FILENAME} !-f # anything else is handed to mtview.php for resolution RewriteRule ^(.*)$ /mtview.php [L,QSA] </IfModule> <IfModule !mod_rewrite.c> # if mod_rewrite is unavailable, we forward any missing page # or unresolved directory index requests to mtview # if mtview.php can resolve the request, it returns a 200 # result code which prevents any 4xx error code from going # to the server's access logs. However, an error will be # reported in the error log file. If this is your only choice, # and you want to suppress these messages, adding a "LogLevel crit" # directive within your VirtualHost or root configuration for # Apache will turn them off. ErrorDocument 404 /mtview.php ErrorDocument 403 /mtview.php </IfModule>
(.htaccessファイルがある場合は、その最後に上記のコードを加えてください。)
上述の"mtview.php"スクリプトは、一度、新しい「ダイナミック・サイト起動用スクリプト」インデックス・テンプレートを再構築すると、作成されます。 ブログ・ルートがサイトのサブディレクトリにある場合は、"mtview.php"スクリプトへのパスを実際の場所になるよう、上記の .htaccess の設定を変更してください(たとえば、ブログ・ルートが"weblog"ディレクトリにある場合、パスは"/weblog/mtview.php"に修正します)。
Apacheサーバーは、mod_rewriteが使用可能になっていない場合、使用できるように設定してください("httpd -l" コマンドを使うと、使用可能なApacheモジュールが一覧表示できます。mod_rewriteモジュールが動的にロードされる場合は、 httpd.conf ファイルの "LoadModule rewrite_module" で始まる行をチェックします)。
さらに、Apacheサーバーは .htaccess ファイルを利用できるように設定する必要があります。この設定はまた、Apacheサーバーの httpd.conf ファイルで指定されています。以下はその一例です(サーバーの設定によって、以下の記述は、グローバル・コンテキストに入る場合も、特定のVirtualHostセクションに入る場合もあります)。
<Directory /> AllowOverride All </Directory>
Internet Information Serverをお使いの場合は、"mtview.php" スクリプトをカスタムのエラー・ドキュメントとして使うように、ウェブ・ディレクトリを設定する必要があります。 その際は、403と404のエラーに対して使ってください。
Movable Type では、従来のスタティック・パブリッシングに加え、ダイナミック・パブリッシングをオプションとして加えました。 どちらか一方だけを選択する必要はありません。両方混在して使えます。
たとえば、インデックスやアーカーブ・テンプレートにはダイナミック・パブリッシングを使い、そのほかのページにはスタティック・パブリッシングを使うことができます。 これは、サイトのパブリッシングの方法に柔軟性を与えてくれます。 インデックスとAtom/RSS/RDFフィードのページにかなりのトラフィックがあるようなサイトでは、こうしたページだけをスタティックに公開する、などを実現できます。
アーカイブ・ページは、トラフィック量が少なく、かつ、最も大きなディスク・スペースを占めるので、通常、ダイナミック・パブリッシングに適しています。
ダイナミック・パブリッシングを使うと、キャッシュされない各ページのビューには、そのページを構築するため、多くのデータベース・クエリー(問い合わせ)が発生します。 ウェブサーバーの性能とテンプレートの複雑度によって異なりますが、1秒もかからないこともあれば、数秒かかる場合もあります。 以下は、ダイナミック・ページの処理速度を最適化するのに、役立つヒントです。
<MTEntries lastn="10">
このパラメータは任意の値に調整できます。
注 : これは実験的な機能であり、環境によってはうまく動作しないこともあります。
ダイナミック・パブリッシングを最適化する別の方法は、ページ・レベルのキャッシングをオンにすることです。 この機能によって、ダイナミック・ページは、1つのリクエストから次のリクエストに移行する間、ファイル・システムにキャッシュされるので、スタティック・ページに近いスピードが得られます。 長期的に見ると、これはディスク・スペースをより多く消費しますが、性能上の利点がそれに勝るかもしれません。
ページ・レベルのキャッシングをオンにするには、ブログのルート・ディレクトリに"cache" サブディレクトリを作成する必要があります。 さらに、777のパーミッションを与える必要があります。 次に、「ダイナミック・サイト起動用スクリプト」インデックス・テンプレートに次の行を加えます。
$mt->caching = true;
この行は"$mt->view();" の行の上に加えてください。 この行を削除すると、キャッシング・オプションが無効になります。
これを設定すると、ダイナミック・ページを表示するときに、作成したキャッシュ・ディレクトリ内にキャッシュするようになります。 キャッシュされた後は、ブログ・コンテンツがそのキャッシュされたページより新しい場合、またはリクエストを受けた場合に限り、1ページずつ再構築されます
ダイナミック・ページに、条件付きリクエスト(HTTP 304応答)を設定できます。 通常、ページがダイナミックに生成される場合、ページは条件なしで生成されます。 中にはこうした状態が適しているケースがあるため、条件付きリクエストはデフォルトでオフになっています。 条件付きリクエストは"mtview.php" スクリプトに以下の行を加えると有効になります。
$mt->conditional = true;
この行は"$mt->view();" の行の上に加えてください。 条件付きリクエストに関連付けられたタイムスタンプは、ブログが最後に変更された時間です。変更とは、コメント、トラックバックping、テンプレートなど、ブログのどの部分に対しての変更も意味します。
さらに機能をアップして、条件付き動作を条件付きで設定できます。 以下はフィードのページで、この機能をオンにするコードです。
if (preg_match('/(index|atom)\.(rss|xml|rdf)/', $_SERVER['REQUEST_URI'])) { $mt->conditional = true; }
Movable Typeのダイナミック・パブリッシング・モードはプラグインもサポートします。 これまでの Perl のプラグインと比べると、アーキテクチャは異なりますが、似ている点もあります。
PHPベースのダイナミック・パブリッシング・エンジンの2つの主要なコンポーネントは、Smarty テンプレート・パッケージ(http://smarty.php.net/)とJustin VincentのezSQLライブラリ(http://php.justinvincent.com/)です。
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/plugins/block.MTLoop.php" を作成します。
<?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/plugins/function.MTLoopIValue.php" を作成します。
<?php function smarty_function_MTLoopIValue($args, &$ctx) { return $ctx->stash('i_value'); } ?>
条件タグは、コンテナ・タグの一種です。以下に簡単な例を示します("php/plugins/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オブジェクト)を返すメソッド名の付いたコンテキストを持ちます。
ダイナミック・パブリッシング・アーキテクチャの概要(英文のみ)は、次のサイトに記載されています。http://www.sixapart.com/pronet/articles/dynamic_publish.html
さらに、Movable Type のPHPレイヤーへカスタム・プラグインを作成する手順については、ProNetサイトの次の記事(英文のみ)をご覧ください。http://www.sixapart.com/pronet/articles/php_dynamic_pub.html
Smartyルーチンの書き方についての詳細は、Smartyのウェブサイト(英文)からも入手できます。http://smarty.php.net/manual/en/plugins.php