≪ BlogPet | メイン | RSS設定 ≫

2005年12月17日

●phpモジュール化やってみました。(第4回:phpモジュール化の際のエラーと再構築高速化)

ようやく4回目です。これが最後かな?
今回は、phpモジュール化の際に出くわしたエラー紹介と、phpモジュール化による再構築高速化です。
と言っても、あくまで俺が出くわしたエラーなので、参考程度ってことで。

1.phpモジュール化時のエラー
前回の最後にエラーが出ると言う内容を記載しました。いや、俺がエラー出しただけだが・・・。
正直、困りまくってネットで情報を集めまくった記憶があります。・・・あれは疲れたよ。
てことで、いくつか対象法を含めて紹介しますね。

☆Parse error: parse error, unexpected T_STRING in ○○.php on line 1
phpモジュール化した後に、一度ぐらいは見てしまうと思われるエラーです。
再構築委したphpファイルをWEB上で見ようとすると、このエラーに出くわしてしまいます。
このエラーは、『該当phpファイルの1行目(line 1)に問題があるよ』って意味です。
だいたいは、該当phpファイル(もしくは参照ファイル)の1行目に下記のソースが記載されているからでしょう。

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

htmlファイルであればまったく問題ないのですが、php化するとこの1行をphpスクリプトと誤認識するようです。
解消するには、この1行がphpスクリプトでは無いという記述が必要になります。
この1行を下記のように変更すれば、多分エラーを解消できると思います。

#参考記事(from Chitatopops)
PHPでMovable Type

<?php echo('<?xml version="1.0" encoding="<$MTPublishCharset$>"?>')."\n" ?>

小粋空間でも同様の記事がありましたが、最後の『."\n"』に関する説明が無かったようでしたので。
この『."\n"』は改行を意味しています。ですが、別に無くても動作には関係ありません。
単にWEB上でソースを確認した際に、ソースの最後に改行を入れてくれるだけです。
ソースをキチンとしたい方は、改行を入れるようにした方が良いでしょう。

☆Warning: readfile(○○.html): failed to open stream: No such file or directory in …
こちらも再構築したphpファイルをWEB上で見ると、出くわしやすいです。
このエラーは、『php読み込み参照先に該当ファイルが無いよ』って意味です。
本当にテンプレート(インデックス)などにファイルを作成していない場合もありますが、主に相対パスのミスです。(^^;
てことで解消方法は、該当ファイルがキチンとある点と相対パスが正しいかを確認すれば良いです。

ついでだから、関連話を。
実は小粋空間のテンプレート初期値では、日付・月付アーカイブが同じテンプレートから出力されます。
日付アーカイブと月別アーカイブは階層が違うため、日付テンプレートから両方を出力すると相対パスのエラーが出ます。

これを防ぐには、まず日付テンプレートとは別に月付テンプレートを作成します。
それから、日付テンプレートから日付アーカイブを、月付テンプレートから月別アーカイブを出力するようにします。
もちろん、それぞれからの参照ファイルへの相対パスは違うので、しっかりと確認して下さいね。
方法に関しては、アーカイブテンプレート作成方法(from 小粋空間)で紹介されているので、そちらをどうぞ。
これで、テンプレート(アーカイブ)に月付テンプレートを追加できると思います。

なお、当blogの記事と同じであれば、月付テンプレートからの参照ファイル(o-masiro.html)への相対パスは下記です。

月別:../../../o-masiro.html


2.phpモジュール化による再構築高速化
前回までで、phpモジュール化はできたと思います。ですが、それだけでは高速化になりません。
モジュール化の大きなメリットは、再構築が常時必要なモノと、そうではないモノを分けるところにあると思います。
(カスタマイズのしやすさもそうですが、一番のメリットはコレでしょうね。)
その結果、閲覧時やエントリー時の時間短縮が望めると言うわけですね。

では、どうするかと言うと・・・やっぱり記事紹介です。(^^;
参考記事を読んで頂ければ、バッチリ理解できるでしょう。

#参考記事(from 小粋空間)
PHPモジュール化の仕組みについて(その4:再構築オプション利用方法)

当blogも、参考記事のとおりに設定しました。やはり、参考記事は強く、そしてありがたいです。(^^
作成したphpスクリプト読み込み参照モジュールファイル(○○.html)は、ほぼチェックをハズしています。
ここらは環境によって変わってくるので、どのテンプレートを常に再構築させておくか考える必要があります。
一応、当blogで再構築オプションがチェックしてあるテンプレート名を紹介しておきます。(2005年12月16日付)

Atom
Dynamic Site Bootstrapper
JavaScript
RSD
RSS 2.0
/* ココより、俺が作成したテンプレート */
メインページ
モジュール_最近のコメント
モジュール_最近のトラックバック

しかし、最近のエントリーやカテゴリーなどは、エントリー時には再構築する必要がありますよね?
(再構築しないと、せっかくの記事がまったく反映されないと言う、涙の罠が待っています。)

これらもモジュール化しているのですが、ほとんど再構築しなくて良いものと見分けれるようにしておきます。
参考として、エントリー時にのみ手動で再構築するテンプレート名も紹介しておきます。

モジュール0_月別アーカイブ
モジュール0_カレンダー
モジュール0_カテゴリー
モジュール0_最近のエントリー

モジュールとモジュール0の場合だと、テンプレート一覧では、モジュール0が上に来ます。(初期設定時)
なので、名称をあえて変更しておくことで、手動再構築するテンプレートが分かりやすくなります。

これで、かなりの量のテンプレートが再構築する必要が無くなります。
ここまでできれば、WEB上からの閲覧やエントリー時の再構築に対する時間短縮になると思われます。

最後に、当blogでのテンプレート(インデックス)におけるテンプレート名を列挙します。(2005年12月16日付)
phpモジュール化において、どんだけの参照モジュールファイルを作れば良いかの指針になればと思います。
どこがどう繋がっているかは、第2回のindex.phpのソースと見比べて下さいな。

いつものように、見たい人は続きを読んで下さいな。


2005年12月14日

●phpモジュール化やってみました。(第3回:phpスクリプトの相対パス化)

ふぅ、この内容もようやく3回目です。
と言っても、自分がしたカスタマイズの内容を自分で覚えれないので、メモに使っているだけですが。(^^;
まぁ、同じようにつまずいた人には有益かも知れないので、きっちりと書いておきます。

では、<?php readfile("moji.html"); ?>の相対パス化の話です。
まずは、phpスクリプトはおいておいて、相対パスと絶対パスについてです。

1.相対パスと絶対パスとは?
(知っている方も多いと思いますので、その場合はこの部分を飛ばして下さいな。)
例として、俺のblogトップとカテゴリートップのアドレスを紹介します。
下記アドレスが、それぞれの絶対パスになります。
(絶対パスは、必ずしもWEB上からのアクセスのことでは無いので、あしからず。)

   blogトップ:http://neta20000.net/index.php
カテゴリートップ:http://neta20000.net/archives/cat_5.php
          1階層目            /2階層目

今度は相対パスを示します。相対パスは基準ファイルから考えるので、位置関係(階層)によって違います。
1階層目にあるindex.phpから見た、cat_5.phpの相対パスは下記です。

./archives/cat_5.php

./』は、基準ファイル(index.php)の場所と同じ階層(1階層目)を示します。

逆に2階層目にあるcat_5.phpから見た、index.phpの相対パスは下記になります。

../cat_5.php

../』は、基準ファイル(cat_5.php)の場所(2階層目)より一つ上の階層(1階層目)を示します。
もっと深い階層から数階層上を目指す場合には、『../../../../』なんて場合も有りますね。

あんまり分かりやすい説明では無いですが、相対パスと絶対パスの概念はこんな感じになっています。
まぁ、ネットで探せばもっと分かりやすい説明があると思うので、困ったらそっちを見た方が無難かも知れませんが。(ぇ
なお相対パスが分からない場合は、絶対パスで指定した方が確実です。

2.phpスクリプトの相対パス化
さて、俺はなんでこんなややこしいことを考えているのでしょうか。
いやね、php用モジュールファイルを毎回WEB上(http://)からアクセスするのは、負荷が掛かりそうな気がしませんか?
少なくとも、相対パスに比べて負荷が掛かるのではないかと、俺は勝手に思っています。
そういうわけで、当blogはphpスクリプトの呼び出し先を、全て相対パスで行っています。
(もし相対パスとWEB上からのアクセスが同じ負荷ならば、俺の苦労は粗大ゴミでぽいっです。)

では、phpスクリプトの参照先を相対パスにする流れを説明します。
第2回の内容(参考記事含む)や相対パスを理解できていれば、そんなに難しくありません。
あくまで、基準ファイルと参照ファイルの位置関係(階層関係)が分かれば良いだけですから。

ではまた、例を挙げつつ説明していきますね。
当blogでは、テンプレート(インデックス)内のメインページに、index.phpを作っています。
同じテンプレート(インデックス)内に、phpスクリプトから呼び込む参照ファイル(○○.html)も作っています。
例えば、読み込んでくる参照ファイルをo-masiro.htmlとしましょう。
この場合、index.phpo-masiro.htmlはテンプレート(インデックス)内に存在するので、同じ階層です。
(無理に設定を変更していないかぎりは、同じ階層になっているハズです。詳しくはFTPで繋いで見て下さい。)
肝心のindex.phpのソースは下記になります。

<html>
<body>
<?php readfile("./o-masiro.html"); ?>
</body>
</html>

まったくもって見る必要ありませんが、o-masiro.htmlのソースは下記です。(^^;

大宮ましろ:Rainy Blue~6月の雨~(エロゲー)の攻略ヒロインで、○学生!
『ましろの宝箱』では、「来年から○学校に通えます」とあるが、いったい何歳だ?(笑

そういうわけで、index.phpから見たテンプレート(インデックス)内にあるファイルの相対パスは、『./ファイル名』です。

ですが、テンプレート(アーカイブ)となると話は別です。
例えば、エントリーアーカイブ・カテゴリーアーカイブ・日付アーカイブでは相対パスがそれぞれ違います。
phpモジュール化(第2回)のやり方を利用した場合は、各種アーカイブの位置関係(絶対パス)は下記になっているハズです。

エントリー:http://neta20000.net/archives/年/月/日/何時何分何秒.php
   日別:http://neta20000.net/archives/年/月/日/index.php
カテゴリー:http://neta20000.net/archives/cat_数字.php

各phpスクリプトから読み込む参照ファイルは、index.phpと同じ場所に作りました。
となると、各テンプレート(アーカイブ)から見た、参照ファイル(o-masiro.html)の相対パスは下記になります。

エントリー:../../../../o-masiro.html
   日別:../../../../o-masiro.html
カテゴリー:../../o-masiro.html

あとは、各テンプレート(アーカイブ)に<?php readfile("相対パス"); ?>を指定し、保存と再構成をすれば完成です。

どうでしょうか、うまく行きましたか?
多分、何かしらのエラーが出てくると思います。(マテ
すくなくとも、俺はエラーが出てきました。・・・かなり困った。(^^;

また、ここまでの作業だけでは再構築時の高速化はあまり意味がありません。
モジュール化によってカスタマイズを楽にしただけですからね。
phpモジュール化の一番の利点は、再構築の有無を有る程度制御できることですから。
これを考えないと、phpモジュール化の意味がかなり減ってしまいます。

そんなわけで、次回ではモジュール化による再構築時の高速化と、このようなphp化でよく見るエラーを紹介します。


2005年12月12日

●phpモジュール化やってみました。(第2回:変更の仕方)

さて、第1回でphpモジュール化の意義とイメージができたと思います・・・多分。(^^;
なので、今回は実際にどうすればいいかを説明します。
とか言いつつ、またもや記事紹介をするのですがね。(ぇ

#参考記事(from 小粋空間)
PHPモジュール化の仕組みについて(その2:具体的動作とMTIncludeとの違い)
PHPモジュール化の仕組みについて(その3:変更方法)
※その3の記事がMovable Type Ver3.1xのままみたい? Ver3.2では下記を参考にして下さい。

1.2 カテゴリー・アーカイブ/日付アーカイブ/個別エントリーアーカイブの場合
管理メニュー『環境設定』の『設定』→『公開』クリックし、一番下のアーカイブ・マッピングを設定する。
エントリー:%y/%m/%d/%h%n%s.php
   日別:%y/%m/%d/index.php
   月別:%y/%m/index.php
カテゴリー:%y/%m/index.php

※管理メニュー『環境設定の『設定』→『公開』の補足設定
アーカイブURL  :サイトURL/archives/
アーカイブ・パス  :サイト・パス/archives/
アーカイブの拡張子:php

とりあえず上記を読んで試してみればだいたい分かってくると思います。
(おかげさまで、なんとかphpモジュール化できました。ありがとうございます。)

では、例としてテンプレート(index.html)のソースを記載しますね。

<html>
<body>
返事がない。ただの屍のようだ。
</body>
</html>

では、モジュール化をしてみましょう。
index.htmlを、index.phpmoji.htmlの2つのテンプレートに分けます。
index.phpは新しくテンプレートを作成して、index.htmlのソースをそのままコピーして、出力ファイル名を変更したものです。
それから、ソース一部に対して修正を加えます。
まずは、index.phpのソース(修正後)を記載します。

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

<?php readfile("moji.html"); ?>の部分をphpスクリプトと呼ぶらしく、このような記述を加えることがphp化らしいです。

次に、moji.htmlのソースを記載します。
こちらは、index.htmlから切り離したいところをコピーするだけです。

返事がない。ただの屍のようだ。

このようにして2つのテンプレートファイルを作成すれば、モジュール化の完了です。
どうですか? これぐらい短いソースであれば、そんなに難しいことではないでしょう?
長いソースでの作業は、小さいモジュール化を繰り返し行うことになると思います。

修正作業はソースを見れば分かりますね。文字の行をphpスクリプトに置き換えただけです。
例は1行でしたが、もちろん複数行をまとめて1つのphpスクリプトに置き換えれます。
どんどん置き換えれば、index.phpの中身がスマートになって見やすく・カスタマイズしやすくなるでしょう。

なお作成したindex.phpをblog上で表示した場合ですが、moji.htmlの中身を読み込んだ状態で表示されます。
すわなち、最初のソース(index.html)と同じ状態になってくれるわけです。

さて、次回は<?php readfile("moji.html"); ?>の相対パス化について考えてみます。

最後にですが、当blogにおけるメインページ(index.php)をサンプルとして記載します。(2005年12月12日付)
phpモジュール化において、どういう風に分けて考るかの参考になればラッキーかな?(^^
見たい人は、続きを読んで下さいな。(長いソースなんでがんばって下さい。)


2005年12月11日

●phpモジュール化やってみました。(第1回:概念)

そんなわけで、まだまだ本稼働じゃないのでずっとカスタマイズのお勉強。
その前に一つだけ書いておかないと。

当blogでは、小粋空間で公開されているVer3.2用テンプレートを利用させてもらっています。
なので、当blogにおけるカスタマイズ記事(主に失敗談などの行き詰まりを書いていくのだが)は全て、上記テンプレートを利用した上での話になります。
(今度、aboutページ作った時に書いておくようにしよう。)

では、カスタマイズの話を・・・。
とりあえずテンプレートを実装してからどこからをカスタマイズをしようと思っている人は、ちょっとややこしいけどphpモジュール化から始めるのをお勧めします。
利点はいくつかあるので、紹介しますね。

1.モジュール化することにより、ソース(html言語)などに記載する量が減るので、若干全体量がシェイプアップされる。
2.モジュール化することによって、カスタマイズ時に修正する箇所が圧倒的に減る。
3.モジュール化することによって、再構築時の量が減り、時間・負荷ともに縮減できる。
  (再構築は、誰かがページを開く時もしているみたい?なので、ページ表示も早くなると思います。)

などが大まかな効果になると思います。
この作業は、blogの記載量が増えれば増えるほど面倒になるので、できたばかりにやってしまうのが吉です。
(俺はMovable Typeを導入して4日目ぐらい。エントリーもほぼ無いのでうってつけでした。)

ではどうやるかということですが、すでに説明されているサイトがあるので、そちらをご覧下さい。(ぇ
PHPモジュール化の仕組みについて(from 小粋空間)
全部読んでしまえば、分かるのでは無いかと思います。
読んで分かる人と、いまいちピンと来ない人が居るとは思いますが、がんばって下さい。俺は後者でした。orz

紹介だけしたのでは記事の意味が無いので、ココからは俺の勝手な補足です。(^^
ちょっと長いですが、phpモジュール化っていまいちピンと来ない人には、助かるかも・・・知れません。

phpモジュール化ですが、実際にはphp化とモジュール化に別れます。
(俺はphpモジュール化=phpを使ってデータベース化などと思ってしまい、すごく難しく感じました。)
html→php化は、まぁスクリプトっぽいものをちょこっと付け足したりする程度だと思って下さい。(俺がやったことはその程度です。)
モジュール化はややこしいですが、プログラムを勉強した人ならばだいたい分かりますよね?
と言っても、blog始める人がみんなプログラムを分かるはずが無いです。
なので、モジュール化について分かりやすく?説明します。

例としてhtml言語でのモジュール化みたいなものを紹介します。
まずmainと言うページを作ったとします。mainにはメニューと本文Aを付けました。
次にsubと言うページを作ったとします。main同様に、subにもメニューと本文Bを付けました。
ここで、mainとsubにはまったく同じメニューが付いたことになります。

となると、メニューに追記する場合はmainとsubの両方に修正が必要です。
でも面倒ですよね? メニュー用ページのmenuを作っておき、これを修正したら一発OKってのが楽ですよね?
それってフレームページを使えば楽じゃない? えぇ、フレーム化すれば重複を有る程度省くことができます。

このように、複数のもの(main・subページ)から重複しているもの(menuページ)を切り離し、
別のもの(例えばフレームページ)上で全部表現できるようにすることを、モジュール化と呼びます。

こう聞くと、『なんだ、普通のページをフレームページ用に作り替えるだけか。』と思うでしょう?
やっていることは、だいたいそんなものです。どうでしょう、モジュール化のイメージが分かりやすくなりましたか?
イメージできれば進むことはできます。もちろん、やる以上は結構面倒なんですけどね。(^^;

次回は、実際にどうするかを説明します。