« 目次

ダイナミック・パブリッシング

ダイナミック・パブリッシングを利用すれば、テンプレートごとにブログ単位でスタティック・ページとダイナミック・ページを組み合わせて、ブログのパブリッシングとトラフィックのバランスを最適化できます。たとえば、サイトのメイン・ページのインデックスやRSSフィードのように、頻繁にリクエストのアクセスがあるページではスタティックに出力し、月別やカテゴリーのアーカイブなど、リクエストのアクセスが比較的少ないページにはダイナミック・ページを使う、などといったことができます。

ダイナミック・パブリッシングを利用する場合、データベースはMySQLPostgreSQLSQLiteバージョン2をお使いください。Berkeley DBやSQLiteバージョン3では動作しません。

ダイナミック・パブリッシングとスタティック・パブリッシングとの組み合わせ

ダイナミック・パブリッシングにはさまざまな利点があります。通常の更新方法の場合、スタティックなHTMLを作成するため、テンプレートなどを変更するたびに再構築の必要があります。しかし、ダイナミック・パブリッシングの場合は、テンプレートなどの変更がすぐに反映されます。大量のエントリーが存在するブログの場合、再構築の時間を大幅に削減できます。

さらに、ダイナミック・パブリッシングはエントリーの数だけHTMLファイルを生成するのではなく、リクエストごとに逐次ページを生成するため、ディスク・スペースの節約にもなります。たくさんのインデックス/アーカイブ・テンプレートを使用したい場合も、容量の心配をすることなしに構築できます。

ただし、リクエストのアクセスが多い場合、サーバーへの負荷が高くなります。そうしたページはスタティック・パブリッシングで公開すれば、負荷を軽減できます。ダイナミックとスタティックを適切に使い分けることで、円滑なシステム運営が可能になります。

ダイナミック・パブリッシングを利用する

  1. ApacheのAllowOverride設定をAllにします。

    ウェブ・サーバーとしてApacheを使用している場合、ダイナミック・パブリッシングのために.htaccessファイルを利用できるように設定する必要があります。Apacheの設定ファイルhttpd.confに以下の記述を追加します。

    <Directory /usr/local/apache/htdocs/mt>
      AllowOverride All
    </Directory>

    .htaccessファイルはステップ1でダイナミック・パブリッシングを使用する設定に変更した時点で自動的に生成されます。

  2. IISに対してはエラー・ハンドラをカスタマイズします。

    IISをお使いの場合は、mtview.phpスクリプトをカスタムのエラー・ドキュメントとして使うように、ウェブ・ディレクトリを設定する必要があります。403404のエラーに対して、mtview.phpへのURLを設定してください。

  3. Movable Typeダイナミック・ページ・オプションを有効にします。

    Movable Typeにログインして、ブログの設定(詳細モード)の公開タブに進み、再構築オプションアーカイブのみダイナミック・パブリッシングで出力しますまたはテンプレート別に、スタティックHTMLもしくはダイナミック・パブリッシングを選択しますのどちらかを選択します。

    後者を選択した場合は、さらに各テンプレートの編集ページでこのテンプレートをダイナミック・ページにするというチェックボックスにチェックすると、そのテンプレートがダイナミック・パブリッシングの対象になります。

  4. テンプレート・キャッシュ・ディレクトリを設けます。

    ブログのルート・ディレクトリに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プラグインAPI

ダイナミック・パブリッシング・モードは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はグローバル・フィルターを加えるためのベースとなります。

変数タグ

カスタム変数タグを実装するプラグイン例です。

  1. 以下をfunction.MTServerUptime.phpという名前のファイルに保存します。
    <?php
    function smarty_function_MTServerUptime($args, &$ctx){
      $data = shell_exec('uptime');
      return $data;
    }
    ?>
  2. function.MTServerUptime.phpphp/pluginsディレクトリにアップロードします。
  3. ダイナミック・テンプレートの1つに、以下を加えます。
    Uptime: <$MTServerUptime$> 
  4. このダイナミック・テンプレートを保存したあとウェブ・ブラウザーで表示します。

コンテナ・タグ

コンテナ・タグを実装する例です。

  1. 以下を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;
    }
    ?>
  2. 次に、以下をphp/plugins/function.MTLoopIValue.phpとして作成します。
    <?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オブジェクト)を返すメソッド名の付いたコンテキストを持ちます。以下のサイトも参照してください。


Copyright © 2001-2007 Six Apart, Ltd. All Rights Reserved.