Movable Type :: php :: 再構築を早くして使い勝手をよくしたい
Movable Typeにはダイナミックパブリッシングというべんりな機能があって、これを使えば再構築が劇的に速くなります。が、MT変数の値をphpの変数に代入できないのがイタいです。ダイナミックパブリッシングはエントリ数が増えてきた頃に(1000以上とか?)その利点がしみじみとありがたいのだけれども、と同時に、エントリ数が多いということはサイト内の構造は以前に増して複雑化してるわけで、あっちこっちでphpを使いたくなってくる頃であったりするので「アッチを優先するとコッチが不便だ」というジレンマに立たされちゃいます。てことありません?
そこで、仕方なくスタティックに切り替えるわけだけれども、エントリ数が多いと再構築に巨大な時間を要するようになり、複雑なテンプレートがたくさんあると非力なサーバでは500が出たりします。「もうこんな人生イヤー!」と叫ぶことになる。そこで、テンプレートの内容を見直して、極力オプティマイズに走ることになる。MTタグの中でMTタグを使う必要のないものをどんどん書き換えていく。こんなかんじで↓
<$MTPublishCharset$> → UTF-8とかEUC-JPとかに書き換える
<$MTBlogURL$> → http://ナンチャラに書き換える
<$MTBlogSitePath$> → /home/ナンチャラのパスに書き換える
<$MTEntryAuthorDisplayName$> → 投稿するのがあなたひとりだけなら自分の名前に書き換えちゃおう
等々 ...
MTタグにしかできないぶぶんだけMTタグを使うようにしていくことによって、かなりサーバの負荷が軽減されて再構築も速くなります。MTのphp化、つまりブログ内の各パーツを局所的にサーバ内に書き出しておいてそれらをincludeするというおなじみの手口もやってたとして、ここまではよくあるヤツなんだけれど、前置きが長くなってしまったのだけれど、もっともっとどうにかしたいゾという話に続きます。phpの知識が要りますけれど。
テンプレートの中にデザイン的な文字列は一切書かないというやり方をときどきやっていますがなかなか良好です。たとえばエントリアーカイブの中身はこんなかんじで書く↓
<?php
$entry_date = '<$MTEntryDate$>';
$entry_title = '<$MTEntryTitle$>';
$entry_comment_count = '<$MTEntryCommentCount$>';
$entry_trackback_count = '<$MTEntryTrackbackCount$>';
$category_name = '<$MTCategoryLabel$>';
$entry_body = <<<EOF
<$MTEntryBody encode_php="heredoc"$>
EOF;
$entry_body_more = <<<EOF
<$MTEntryMore encode_php="heredoc"$>
EOF;
include('../cgi-bin/entry_archive.php');
?>
じっさいにはもう少し長くなりますが、サンプル目的なので簡略化しました。上でやってることはつまり、必要なデータ類をphpの変数に代入し、最後にincludeで別のphpファイルに処理を渡しているワケです。Movable Typeのお世話になるのはココで終了。htmlタグとcssによるデザイン処理はinclude先でやるということです。
こうすることによって、Movable Typeが吐き出すファイルがとても小さくなり、その結果、エントリーアーカイブの再構築による負荷を軽減できます。また、スタティックでありながら、デザインを変えたいときにはinclude先のphpをいぢることによって再構築をすることなくスグにページに反映されるという利点があります。エントリーアーカイブを例に出しましたが、インデックスもカテゴリもすべてこのパターンに突っ込んだらかなり使い勝手がよくなりました。
これはかなり良いですよ。「ココの罫線をドットにしてみるかぁ」と思ったとき、テンプレート内でデザインをしていたらばちょこっと変えるたんびにすべてのエントリを再構築しなくちゃいけないでしょう?ダイナミックパブリッシングで不満のない方にとっては意味がありませんが、私のような者にはありがたいということです。
注意すべきポイントがひとつあります。変数の中身に入るであろう文字列に注意を払いましょう。'〜'の中に'が入ったらエラーになるとかそういうことです。幸いMovable Typeの変数にはべんりなグローバル属性がたくさん用意されていて、たとえば、phpのヒアドキュメントで使いたいときには encode_php='heredoc'なんていうのを仕込んでおくとエラーを回避できたりします。この中にはイロイロとべんりなものがあって、urlエンコードするヤツとかあります。Javascriptで使えるようになるヤツとか、document.writeにブチこみたいときに重宝します。詳しくはココ見てください↓
ダイナミックとスタティックのはざまで辛い人生を送っている方はこんなやり方を導入してみてはいかがでしょうか。
このエントリーのトラックバックURL:
http://blog.3ot.net/ping/938
