2005年3月 9日

Movable Type の PHP モジュール化の仕組みについて(その4:再構築オプション利用方法)

March 9,2005 5:35 PM
Tag:[, , , ]
Permalink

この回ではモジュール化による再構築オプションの有効な利用方法について説明します。

「再構築オプション」は各テンプレート編集画面の右上にあるチェックボックスを指します。このオプションはユーザー・マニュアルテンプレートの編集にある通り、チェックボックスにチェックをつけるとエントリー投稿時等に再構築対象となり、逆にチェックを外すとテンプレート編集画面等から再構築をしない限り情報は更新されません。つまりモジュール化において「再構築オプション」にチェックをする・しないが、再構築時間短縮の重要なポイントになります。

ということでチェックするための目安となる表を作ってみました。

モジュール化対象データ再構築が必要な契機チェック要否
ブログタイトル・バナー・バージョン等管理画面等からの変更時不要
カレンダー次表参照
最近のエントリー
カテゴリーリスト
月別アーカイブリスト
最近のコメントコメント投稿時
最近のトラックバックトラックバック受信時

チェック要否の要・不要は主観的な判断です。タイトル等の恒常的に普遍なモジュールは基本的に再構築対象とせず、「最近のコメント」「最近のトラックバック」のモジュールは「再構築オプション」にチェックをつけておかないとコメントが投稿された時にコメント内容がリアルタイムにページに反映されなくなります。
カレンダー?月別アーカイブリストについての再構築要否については再構築契機を細分化できるので、次表に分けてみました。

データ再構築が必要な契機
カレンダーその日の最初のエントリー投稿時
最近のエントリーエントリー投稿時(更新時は不要)
カテゴリーリスト件数表示:エントリー投稿時
件数非表示:新カテゴリーでのエントリー投稿時
月別アーカイブリスト件数表示:エントリー投稿時
件数非表示:月の最初のエントリー投稿時

カテゴリーリスト・月別アーカイブリストの「件数表示・非表示」の意味は次の通りです。
例えば月別アーカイブリストにエントリー件数を表示していない(=件数非表示)場合、ある月のリンク(月別アーカイブページへのリンク)を月別アーカイブリストに追加するためには、その月の最初のエントリー投稿後に「月別アーカイブリスト」のモジュールを一度だけ再構築すればよく、このモジュールは次月まで再構築する必要はありません。ただしエントリー件数を表示している(=件数表示)場合はエントリー投稿後に再構築しないと件数が反映されません。
カテゴリーリストも同様です。

基本的には、タイトル等のスタティックデータ用モジュールを除いた全てのモジュールに再構築オプションをチェックしておけば利便性が良いのですが、レンタルサーバ等で500エラーが頻発する場合、再構築オプションのチェックを外し、エントリー投稿後に必要なモジュールを個別に再構築するのが良いのではないかと思います。
削除動作については管理メニューから再構築が促されるので省略しています。

それぞれのモジュールを個別のインデックステンプレートとして登録すると、数が増えてメニューや管理が煩雑になるので、いくつかのモジュールをまとめてひとつのインデックステンプレートとするのもよいでしょう。またアーカイブページによってモジュールのレイアウトが異なる場合は、レイアウト用の中間的なモジュールを作ると個別モジュールが再利用できて便利です。

Comments [12] | Trackbacks [4]
2005年3月 8日

Movable Type の PHP モジュール化の仕組みについて(その3:変更方法)

March 8,2005 3:38 PM
Tag:[, , , ]
Permalink

PHPモジュール化をする場合の具体的な変更方法です。

1.モジュールを引き込む元となるテンプレートの変更

これはメイン・ページや各アーカイブテンプレートが対象になり、以下の作業を行います。

1.1 インデックステンプレート(メインページ等)の場合

  1. 管理メニューの「テンプレート」をクリック
  2. インデックス・テンプレート欄より該当のテンプレートをクリックし、テンプレート内部のモジュール化したい部分を切り取ってメモ帳などにペースト(切り取った位置を忘れないようにコメントでマークしておくか、先に3を実施)
  3. テンプレートから切り出した部分を
    <?php readfile("filename"); ?>
    に置き換え(filenameについては2、3項を参照)
  4. XML宣言の修正
  5. 出力ファイル名の拡張子を .php に変更
  6. 保存・再構築
  7. .htaccess対処(必要に応じて)
  8. 拡張子が .html で配置されている旧ファイルを削除(必要に応じて)

4.は、テンプレートの1行目にXML宣言

<?xml version="1.0" encoding="<$MTPublishCharset$>"?>

がある場合、5.で拡張子を index.php にして表示すると、ページが真っ白になるか

Parse error: parse error, unexpected T_STRING in [...] on line 1

というようなエラーが表示されます。これはXML宣言がPHPとして誤解釈されてしまうための事象です。
これを回避するには、XML宣言を削除するか、

<? echo('<?xml version="1.0" encoding="<$MTPublishCharset$>"?>') ?>

とPHPが解釈可能なフォーマットに変更してください。

5.は、例えばメインインデックスの場合

index.html → index.php

に変更します。これを行わないと 3.でテンプレート内に記述したPHPスクリプトが動作しません。

6?8は2項の部品化が完了してから行ってください。6.は5.でファイル名を変更することによって検索エンジンからのアクセスや PageRank 等に影響を及ぼすため、必要に応じて .htaccess によるリダイレクト(?.html でアクセスされたら ?.php を表示すること)を行います。エントリーがある程度たまっている方は .htaccess を使われることをお勧めします。詳細については別の機会に記述します。

8.は、7.の対処が不要な場合、例えばファイル名が index.html かつURLにファイル名が指定されていない場合等に行います。index.html を削除する理由は、拡張子によってファイルアクセスの優先順位が異なるためです。
例えば、新しく index.php を生成しても同じディレクトリに index.html が残っていると、サーバは index.html に先にアクセスします。つまり一般的には .html や .htm が .php より優先される訳です(厳密にはサーバの設定に依存しますが一般的にはこのようになっています)。

なお index.html を削除する前に URLで http://~/index.php まで指定してファイルの正常性を確認されることをお勧めします。生成に失敗した状態で index.html ファイルを削除するとアクセスが全て index.php に流れてしまうためです。

1.2 カテゴリー・アーカイブ/日付アーカイブ/個別エントリーアーカイブの場合

下記の手順で変更します。

  1. 管理メニューの「ウェブログの設定」をクリック
  2. 次のページ右上の「アーカイブの設定」をクリック
  3. 「アーカイブ」欄にある「アーカイブ・ファイルのテンプレート」に青色部分
    • 個別:<$MTArchiveDate format="%Y/%m/%d-%H%M%S"$>.php
    • 日別:<$MTArchiveDate format="%Y/%m/%d/"$>index.php
    • 月別:<$MTArchiveDate format="%Y/%m/"$>index.php
    • カテゴリー:cat_<$MTCategoryID$>.php
    をそれぞれ設定します。上記は一例ですのでフォーマットは任意の形式に変更することができます。format 属性にある %Y は年、%m は月、%d は日を表わします。また "/" はディレクトリになります。"-" や最後の "index.php" はそのままファイル名に反映されます。
  4. 変更後、保存・再構築します。

2.モジュールの作成

次に部品となる方のテンプレートを作成します。

  1. 管理メニューの「テンプレート」をクリック
  2. インデックス・テンプレートの右上にある「新しいインデックス・テンプレートを作る」をクリック
  3. 下記の項目を設定
    • テンプレートの名前:任意
    • 出力ファイル名:任意
    • テンプレートの内容:アーカイブテンプレート等から切り出したメニューリスト等のMTタグをペースト
    • 再構築オプション:チェック

以下は「最近のエントリー」をモジュール化する場合の例です。

  • テンプレートの名前:最近のコメント
  • 出力ファイル名:recentEntries.html
  • テンプレートの内容:
<div class="sidetitle" id="entryname">
Recent Entries
</div>
 
<div class="side"id="entrylist">
<MTEntries lastn="10">
<a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a><br />
</MTEntries>
</div>

「テンプレートの名前」は管理メニュー上で表示するだけのものですので日本語でもOKです。「出力ファイル名」はこのテンプレートが再構築された時、ローカル・サイト・パスに出力されるファイル名です。一応拡張子として「.html」を付与していますが、このファイルに直接URL指定してアクセスする必要がなければ「.txt」でも大丈夫です。なおこのファイル名が1項の元テンプレートに埋め込む filename になります。
「再構築オプション」はモジュール化で重要なキーとなる部分です。ここでは「チェック」にしていますが、具体的な内容は次回詳しく説明したいと思います。

3.パスについて

1項の filename の補足ですが、ファイル名にはパスが必要です。パスは絶対パス(ルートとなるディレクトリからファイルが配置されているディレクトリまで)または相対パス(参照元のファイルがある位置からファイルが配置されているディレクトリまで)で記述します。テンプレートと同じ位置にあればパス名は不要ですが、モジュールは各アーカイブから利用されるのが一般的ですので、一律絶対パスを用いるのが良いでしょう。

4.コメント・プレビュー/コメント・エラーでのインクルードについて

この項目は我楽さんより頂いたご質問の反映ということで急遽追加致しました。これらのテンプレートは実体が存在しない(CGIプログラムによるHTTPレスポンス)ため、設定方法が異なります。また現状ではPHPスクリプトが評価できる方法が不明であるため(環境設定に依存?)、このファイルからインクルードする場合は

<$MTInclude file="filename"$>

を用います。

5.PHPスクリプトをインクルードする場合

上記のサンプルではMTタグが記述され(て実体に展開され)ただけのファイルをインクルードしていますが、PHPスクリプトが記述されたファイルをインクルードする場合もあると思います。
例えば、いくつかのモジュールのインクルードをまとめた

<?php readfile("recentEntries.html"); ?>
<?php readfile("recentComments.html"); ?>
<?php readfile("recentTrackbacks.html"); ?>

という内容の中間的なモジュール hogehoge.php を想定します。この hogehoge.php をさらにメインインデックス等からインクルードする場合には、

<?php include("hogehoge.php"); ?>

と記述します。readfile はファイルを読み込むだけの関数ですが、include はファイルを読み込み、さらにそれをプログラムとして評価するための関数です。拡張子は実験したところ任意の名称で問題ないようですが、単体でPHPスクリプトの動作を確認する場合等を考慮して .php にする方が良いでしょう。
逆に言うと、PHPスクリプトが記述されていないファイルをインクルードする場合は

<?php readfile("?.html"); ?>

で大丈夫ということです。インクルードが何段にもなる場合は、インクルード元に近い方から include 関数を用いて、一番末端だけ readfile 関数または include 関数を使用、という構造になります。

以上です。
当初、「PHPスクリプトでないファイルの拡張子は .html でOKです」というオチにするだけの予定だったのですが、最初のサンプルで、

<?php include("http://?.html"); ?>

としていたところ、その1Ogawa::Memoranda さんから頂いたコメントにある通り「PHPプログラムを含まないのであれば includeで読み込むのは得策ではありません」「サーバーサイドにあるファイルはURL指定する必要はありません」とのことで、記述を変更致しました。勉強不足、失礼致しました。あわせてご指摘感謝致します。
なお他のサーバにあるファイルを読み込む場合は上記のようなURL指定を行います。

ということでミイラ取りがミイラになりました。(つづく)

2006.03.17
XML宣言の修正について追記しました。

Comments [49] | Trackbacks [23]
2005年3月 6日

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

March 6,2005 11:58 PM
Tag:[, , , ]
Permalink

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

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

Comments [4] | Trackbacks [3]
2005年3月 4日

Movable Type の PHP モジュール化の仕組みについて(その1:概要)

March 4,2005 11:55 PM
Tag:[, , , ]
Permalink

ブログでは「PHPモジュール化」という言葉を耳にされる機会が少なくないと思います。このサイトでもよく用いる言葉で用語集にも掲載していますが、PHPモジュール化についての具体的な説明がなかったので改めて書いてみたいと思います。

用語集の繰り返しですがモジュールは「部品」を指します。よく使われるのはサイドバーメニューのモジュール化です。具体的には「最近のエントリー」や「最近のコメント」等のメニューリストのMTタグ部分をメインインデックスやカテゴリーアーカイブ等のテンプレートから分割して、それらをひとつひとつの部品として新たなテンプレートを作ります。
メインインデックスやカテゴリーアーカイブ・日別アーカイブ・個別エントリーアーカイブには部品となった
メニューリスト本体は存在せず、部品をインクルードするタグ

<? readfile("/blog/koikikukan/hogehoge.html"); ?>

を埋め込みます。

PHPモジュール化のメリットは、部品化による作業効率の向上に加え、再構築時の性能向上、つまり時間短縮が挙げられます。
性能の話の前に再構築について分かる範囲で説明致します。スタティックページ生成の場合、再構築を実行することによってテンプレート上の全てのMTタグがMovable Typeのプログラムで解釈され、HTML文書(スタティックページ)が生成されます。仮に半年分で100の記事があり、それらが10カテゴリーに振り分けられているとすれば、サイト全体の再構築を行った場合、計117(メインページ×1・月別アーカイブ×6・カテゴリーアーカイブ×10・個別エントリーアーカイブ×100)のHTMLページが一気に生成されることになります。

生成される情報の中にはリアルタイムな再構築が不要なデータ(ブログ名等)、あるいはエントリーやコメント投稿時のみ再構築されればよいものもあり、これらについては各アーカイブページの再構築と同時に新たに生成する必要はほとんどありません。
つまりPHPモジュール化とは、再構築を頻繁に行う必要がない情報を部品としてまとめておき、必要な時だけ再構築を実行することで時間短縮する手法と認識しています。ただし劇的な短縮を望むものではありません。

PHPを利用しない「テンプレート・モジュール(管理メニュー「テンプレート」の一番下)」を用いたモジュール化もありますが、これは単に情報を部品として分割するだけなので、性能向上というメリットはありません。もちろん作業効率向上やテンプレート編集時の視認性向上という意味ではPHPモジュール化と同様です。ちなみにテンプレートモジュールを用いる場合のインクルードタグは

<$MTInclude module="hogehoge"$>

となります。両者の違いは次回ご説明致します。(つづく)

Comments [23] | Trackbacks [14]
Now loading...
ギターに入った猫
掲載広告募集
Styles
Font Size
Default
For defective color vision
Gray Scale
RGB Color
Search this site

このブログをメールで購読する by:FeedBurner


AMN
Categories
Monthly Archives
2017年
2016年
2015年
2014年
2013年
2012年
2011年
2010年
2009年
2008年
2007年
2006年
2005年
2004年
2003年
BlogPeople
Syndicate this site
FeedBurner(RSS1.0/RSS2.0/Atom)
Counter
これまでのアクセス
Powered by
Movable Type 6.0.3