Movable Type の PHP モジュール化の仕組みについて(その2:具体的動作とMTIncludeとの違い)
それでは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を動作させることも可能です)が、ここでは一般的な作法に基づいて説明しています。
- Movable Type 4 の PHP モジュール化
- MTInclude タグによる SSI(サーバサイドインクルード)不要なインデックステンプレートのモジュール化
- .htaccess によるリダイレクト
- Movable Type の PHP モジュール化の仕組みについて(その4:再構築オプション利用方法)
- Movable Type の PHP モジュール化の仕組みについて(その3:変更方法)
- Movable Type の PHP モジュール化の仕組みについて(その1:概要)
- テンプレート・モジュールの利用
≫ MTIncludeタグの使い方とモジュール化 from WingMemo
このブログで使うカスタマイズによく出てくるのが<$MTInclude$>いうタグです。これは非常に便利なタグで、特にダイナミック化している場合... [続きを読む]
≫ seesaaブログ用テンプレート from アリさんぶろぐ
いまひとつ、提供されるテンプレートのバリエーションが少ない気がする、我がseesaaブログですが、movabletype用テンプレート配布で有名な小粋空間... [続きを読む]
≫ 最近のエントリをアーカイブで表示 from KSMT::HR/HM blog
全てのページで最近のエントリをサイドバーに表示していますが、モジュール化して外部... [続きを読む]
こんちわー。^^
ちょいとご質問。
私のところ、カレンダー部分がPHPでモジュール化されているのですが、リアルタイムカレンダーに直したところ、コメントプレビュー画面でリアルタイム処理のPHPが処理されず、そのまま出力されてしまっていたんですよねぇ。
モジュールの方は、MTinclude で読み込ませて普通に処理してくれるようですが、モジュール内に書かれている PHP は駄目なんですねぇ。何ででしょう?コメントプレビュー等の特別なテンプレートは html だからでかー?
>Border.さん
こんばんは。
コメント・プレビュー!そこまで気がつきませんでした!
ということでその3で書いてみました(お名前もれてましたので追記しました)。
でコメント・プレビューで直接インクルードするパターンを試してみましたがダメでした。サーバでPerl-CGIとPHPを処理しているのですが両者は排他的なのでしょうか。
検索しても全く情報ありません。
ちなみに月送りカレンダー用のiframeタグはそのまま貼り付けている(ここにphpのURLが書かれています)のは正常に動作しています。
>yujiroさん
あちゃー、こっちを先に見ればよかった。(苦笑)
前のコメントは、無視していただいて結構ですよー。(笑)
なるほどー。ifame を使用すれば表示されるんですねぇ。今度試してみますぅ。今、デザインいじってるんで、新しいやつで。(笑)
>Border.さん
こんばんは。
ということで、めちゃめちゃデザイン変わってるんですけど!!(笑)