Personal Computer, Financial Planning, etc...

PHPによるページ動的生成作戦

Movable Typeでは、エントリーを追加したりしたときには、再構築を行ってHTMLファイルをあらかじめ(静的に)作っておくことが基本になっています。
ただ、この方式だと、エントリーが増えると再構築に時間がかかるようになります。レンタルサーバーの業者では、CGIの実行時間に制限が設けられていることがあり、再構築時に時間切れになって500エラーが表示されることもあります。

mt.cfgのパラメータを調節したり、BlogをPHP化してテンプレートを部品に分けたりすることで、ある程度はこの問題への対策をすることができます。
しかし、それは抜本的対策とはいえません。根本的な対策は、静的な再構築を行わずに、ページにアクセスがあったときに動的にページを作り出すことです。

Movable Type 3.1では、動的なページ生成を行う「ダイナミック・パブリッシング」という機能があります。
ただ、ダイナミック・パブリッシングでは、既存のプラグインのうち、テンプレートタグを拡張するものが使えなくなるという致命的な弱点があります。

PHPはさまざまな処理を行うことができますが、MySQLなどのデータベースにアクセスする機能もあります。
そこで、PHPを使ってMySQLに直接にアクセスし、ページを動的に生成するようなライブラリを計画しています。

まだ作り始めた段階ですが、ダイナミック・パブリッシングとは違って、既存のテンプレートから段階的に動的生成に移行できるような仕組みにすることを考えています。
また、静的再構築と組み合わせることで、既存のプラグインも何とか利用できる形にする計画です。

なお、以下のページにアクセスすると、テスト作成中のインデックスページを表示することができます。

http://www.h-fj.com/blog/phpindex.php


スタイルシートのPHP化(その2)

前回のエントリーに続いて、スタイルシートのPHP化を紹介します。

前回のエントリーでは、PHP化したスタイルシートをHTMLファイルの中に組み込む形になっています。
しかし、linkタグを使って、スタイルシートをHTMLファイルと別ファイルにすることも多いです。

そのようにしたい場合、以下のような手順を取ります。


スタイルシートのPHP化(その1)

Blogをはじめとして、スタイルシートを使ってWebページをデザインすることが多くなってきました。

スタイルシートを作っていると、「ある箇所を変更すると、それに連動して他の箇所も変更する」ということがよくあります。
例えば、以下のようなスタイルシートを考えてみてください。幅700ピクセルの「container」の中に、幅200ピクセルの「left」と、幅500ピクセルの「contents」を、2段組で配置することを想定しています。

<style type="text/css">
<!--
#container { width : 700px; }
#left      { width : 200px; float : left; }
#contents  { width : 500px; float : left; }
-->
</style>


ここで、「left」の幅を100ピクセル増やして、300ピクセルに変えるとしましょう。すると、それに連動して、「container」の幅も100ピクセル増やすことが必要になります。
ただ、このような変更は、忘れたり間違えたりすることも多いです。それが原因で、Webページの表示が意図しないものになることも、よくあることです。

このような問題は、スタイルシートをPHPで出力することで、解決することができます。ある変更が他の箇所に影響する場合は、それらの箇所をすべてPHPのスクリプトで出力するようにすればOKです。
例えば、先程の例の場合だと、幅を出力する部分を、以下のようにPHPのスクリプトに置き換えます。

<?php
$left_width = 200;
$contents_width = 500;
$container_width = $left_width + $contents_width;
?>
<style type="text/css">
<!--
#container { width : <?php print($container_width); ?>px; }
#left      { width : <?php print($left_width); ?>px; float : left; }
#contents  { width : <?php print($contents_width); ?>px; float : left; }
-->
</style>


この状態で、「left」の幅を300ピクセルに変える場合、「$left_width = 200;」の文を「$left_width = 300;」に変えます。
「container」の幅($container_width)は、「$container_width = $left_width + $contents_width;」の文で計算していますので、$left_widthを変更することで、$container_widthにも変更が反映されることになります。

スタイルシートが出来上がるまでにはいろいろと試行錯誤が必要ですが、上記のようにスタイルシートをPHP化することで、完成までの時間を短縮することができると思います。
また、1つのスタイルシートをベースにして、スクリプトで場合分けをして、複数のスタイルシートを作り出すようなことも考えられます。


エントリーを一度投稿した後、内容を編集して再度保存すると、エントリーのURLが時々変わってしまうという現象が起こっていました。
URLがいつも変わるわけではなく、時々だったので、再現方法もなかなか分からず、どうしたものかと思っていました。
特に、トラックバックをいただいた後で、URLが変わってしまうと、せっかくのトラックバックが正しく機能しなくなってしまうことが問題でした。


2005年10月3日 サーバーの移転に伴い、PHP版ダイナミックパブリッシングから、自作のPerl版ダイナミックパブリッシングに変更しました。

このBlogをダイナミックパブリッシング化しました。

先日書いたように、いくつかのタグに不具合がありました。さらに、MTCommentタグとMTPingsタグにも不具合が見つかりました。
ただ、自力で直せるところはPHPプラグイン等を作って何とか直して、一応まともに表示できるようになりました。

また、動的生成のメリットを生かして、1ページに10件ずつ情報を表示し、次のページや前のページに移動できるようなPHPプラグインも作って、入れてみました。
静的生成だとMTPaginateというプラグインがありますが、それと似たような処理をするものです。

ついでにスタイルシートも変えて、メインのサイトとほぼ同じ雰囲気にしました。


Movable Typeの3.1以降では、「ダイナミックパブリッシング」という機能が追加されています。

ダイナミックパブリッシングは、ページにアクセスがあった時点で、動的に出力を生成する機能です。従来のような静的な再構築と比べると、以下のようなメリットがあります。

・再構築の時間が短くて済む
・Webサーバのディスク容量を節約できる

一方、デメリットとしては以下のようなものがあります。

・動的にページを生成するので、Webサーバの処理能力によっては、ページの表示に時間がかかる場合がある
・従来のPerlのプラグインが使用できず、PHPでプラグインを作りなおす必要がある

現在、ダイナミックパブリッシングをテストしているところです。ページの表示速度は特に問題ないですが、当方でテストした限りでは、以下のタグの動作に不具合が出ました。カテゴリー関連に不具合が集中しているようです。

・MTCategories
・MTSubCategories
・MTParentCategories

ネットで検索してみたところ、私と同様にカテゴリ関係に不具合があるという方の記事もありました。

3.11→3.121のバージョンアップで幾分ましにはなりましたが、まだ完全には解決していません。
まもなく3.14の日本語版がリリースされるようですが、ダイナミックパブリッシング関連の不具合が修正されることを希望したいです。

先頭 /29ページ