Movable Type の PHP モジュール化の仕組みについて(その2:具体的動作とMTIncludeとの違い)

Movable Type の PHP モジュール化の仕組みについて(その2:具体的動作とMTIncludeとの違い)

Posted at March 6,2005 11:58 PM
Tag:[Customize, Module, MovableType, PHP]

それではPHPモジュール化の具体的な動作です。ブログURLというほぼ不変なデータを例に、モジュール化を利用する場合・しない場合の動作の違いを踏まえて説明します。

まずモジュール化をしない場合です。私のサイトで DisplayURL というインデックステンプレートを作り、displayURL.html というファイルを生成するものとします。テンプレートには下記の内容が設定されています。

<html>
  <body>
    <$MTBlogURL$>
  </body>
</html>

このファイルを再構築すると

<html>
  <body>
    http://www.koikikukan.com/
  </body>
</html>

となり、MTBlogURL が本来のURLに解釈されたスタティックページ displayURL.html が出来上がります。仮にこのファイルがメインページであれば、MTBlogURL は再構築される度に変換されることになります。

次にモジュール化をした場合の例です。同じく DisplayURL というインデックステンプレートを作り、ファイル名は displayURL.php と設定します(拡張子の理由は後述)。テンプレートには下記の内容を設定します。

<html>
  <body>
    <?php readfile("blogURL.html"); ?> *1
  </body>
</html>

モジュール化の場合にはモジュール、つまり緑色で示した blogURL.html という部品を作っておく必要があります。そのために BlogURL という名称で別のインデックステンプレートを作り、blogURL.html を生成する設定を行います。テンプレートの中身は下記の1行です。

<$MTBlogURL$>

予めこのモジュールを単体で再構築しておくと

http://www.koikikukan.com/

という内容のスタティックページ blogURL.html が生成されます。
さて、この状態で先の displayURL.php を再構築しても

<html>
  <body>
    <?php readfile("blogURL.html"); ?>
  </body>
</html>

と、内容は変化しません(この「変化しない」ということが重要)。そしてこの後ブラウザで displayURL.php にアクセスすると、このページのHTMLソースは、

<html>
  <body>
    http://www.koikikukan.com/
  </body>
</html>

となり、ブラウザに

http://www.koikikukan.com/

が表示され <?php ~ ?> の部分がページ表示時に初めて変化することがお分かりになると思います。つまり displayURL.php の再構築時、MTBlogURL を変換するオーバーヘッドが少なくなるということを示しています。

ここでは MTBlogURL という単純なデータで説明しましたが、これが「最近のエントリー」や「カテゴリーリスト」、「月別アーカイブリスト」等で、しかも各アーカイブページテンプレートに対し前者の形で設定されていると、結構なオーバーヘッドになると考えられます。

上記の説明をまとめると、MTタグは再構築時に解析され・実体に変換されますが、PHPスクリプトはページを表示する時に変換された実体をインクルードします。表に示すと下記のようになります。

MTタグPHPスクリプト
再構築実行
ページ表示実行

再構築によるオーバーヘッドを減少させるためには、赤字で実行される部分をできるだけ青字の部分で実行できるように移行する訳です。

前回のもうひとつのパターン

<$MTInclude module="hogehoge"$>

との違いですが、これはを再構築時にモジュール hogehoge をインクルードしてスタティックページを生成するので、効果は再構築と同様という認識です。

なお、PHPがファイルを「phpプログラムである」と認識させるための条件があります。それはPHPスクリプトが記述されたファイルの拡張子が .php であるということです。*2
もしモジュール化したサンプルの拡張子が .html であれば、ブラウザに表示される際のHTMLソースは

<html>
  <body>
    <?php readfile("blogURL.html"); ?>
  </body>
</html>

となるでしょう(つまり何も変わりません)。(つづく)

その1:概要
その2:具体的動作とMTIncludeとの違い
その3:変更方法
その4:再構築オプション利用方法

*1:<?php ? ?> は「PHPスクリプト」と呼ばれるもので、PHPはこの部分を「PHPのために書かれたプログラムである」と認識して(ページを表示するちょっと前に)処理を実行します。

*2:ApacheというHTTPサーバで「拡張子 .php であればPHPを実行させる」という設定をするので、厳密に言えば環境依存です(設定によっては .html のままPHPを動作させることも可能です)が、ここでは一般的な作法に基づいて説明しています。

関連記事
トラックバックURL


トラックバック

MTIncludeタグの使い方とモジュール化 from WingMemo
このブログで使うカスタマイズによく出てくるのが<$MTInclude$>いうタグです。これは非常に便利なタグで、特にダイナミック化している場合... [続きを読む]

Tracked on March 4, 2006 1:16 PM

seesaaブログ用テンプレート from アリさんぶろぐ
いまひとつ、提供されるテンプレートのバリエーションが少ない気がする、我がseesaaブログですが、movabletype用テンプレート配布で有名な小粋空間... [続きを読む]

Tracked on March 14, 2007 11:35 AM

最近のエントリをアーカイブで表示 from KSMT::HR/HM blog
全てのページで最近のエントリをサイドバーに表示していますが、モジュール化して外部... [続きを読む]

Tracked on January 14, 2009 10:41 PM
コメント

こんちわー。^^
ちょいとご質問。

私のところ、カレンダー部分がPHPでモジュール化されているのですが、リアルタイムカレンダーに直したところ、コメントプレビュー画面でリアルタイム処理のPHPが処理されず、そのまま出力されてしまっていたんですよねぇ。

モジュールの方は、MTinclude で読み込ませて普通に処理してくれるようですが、モジュール内に書かれている PHP は駄目なんですねぇ。何ででしょう?コメントプレビュー等の特別なテンプレートは html だからでかー?

[1] Posted by Border. : March 8, 2005 10:37 AM

>Border.さん
こんばんは。
コメント・プレビュー!そこまで気がつきませんでした!
ということでその3で書いてみました(お名前もれてましたので追記しました)。

でコメント・プレビューで直接インクルードするパターンを試してみましたがダメでした。サーバでPerl-CGIとPHPを処理しているのですが両者は排他的なのでしょうか。
検索しても全く情報ありません。

ちなみに月送りカレンダー用のiframeタグはそのまま貼り付けている(ここにphpのURLが書かれています)のは正常に動作しています。

[2] Posted by yujiro : March 8, 2005 9:00 PM

>yujiroさん
あちゃー、こっちを先に見ればよかった。(苦笑)

前のコメントは、無視していただいて結構ですよー。(笑)

なるほどー。ifame を使用すれば表示されるんですねぇ。今度試してみますぅ。今、デザインいじってるんで、新しいやつで。(笑)

[3] Posted by Border. : March 9, 2005 3:09 AM

>Border.さん
こんばんは。
ということで、めちゃめちゃデザイン変わってるんですけど!!(笑)

[4] Posted by yujiro : March 10, 2005 12:33 AM
コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)