2012年4月17日

SSIか、PHPインクルードか、それが問題だ

投稿者: 管理者

SSIかPHPインクルード、どっちでいこうといいのですが、それぞれの特徴をまとめてみたいと思い。

まずSSI
SSI を使用するには、サーバーがSSI を許可する設定になっている必要がある。
レンタルサーバなどでは、セキュリティのために使用を禁止しているところもある。
サーバ・サイド・インクルードということで、書き方はこうなる。

[html]
<!–#include file="header.html" –>
[/html]

トップページ用ファイル、index.shtml があるとして、同じディレクトリ(この場合、ルートディレクトリ)に、header.html がある場合の記述。
拡張子がshtmlになっていることにも注意する。

/contents/ というディレクトリがあるとして、そこに配置した場合は、以下のようになるが、

[html]
<!–#include file="contents/header.html" –>
[/html]

逆はダメだ。

[html]
<!–#include file="../header.html" –>
[/html]

../ や絶対パス名は使用できない(サーバが多いと思います)。
file を使うときは、カレントディレクトリの上位階層を経由するパス名は指定できないのだ。

virtual引数
virtual では、サーバはルートディレクトリからファイルの探索をする。
この引数が示すパスは、上位階層にあるファイルを指定するためなので、必ず「 / 」で始めること。
同じディレクトリ、あるいは下位ディレクトリのファイルを指定する引数は、file を選ぶことになる。

ちなみに拡張子のshtmlは、htaccessで制御できる。

[html]
Options +Includes
AddType text/x-server-parsed-html .shtml .html
[/html]

上記のようにすると、htmlでもSSIを使えるようにできる。

SSIを使ってみて思うことは、とにかくパスの書き方に注意が必要だということ。
html や htm のファイルに対して SSI を使用可能にしておくと、Webサーバーがたくさんのファイルに対して SSI の処理をさせてしまうため、パフォーマンスがおちるかも。shtml のファイルにだけ SSI 処理するようにすることで軽減できる。
html や htm のファイルに対して SSI を使用可能にしておくと、セキュリティが弱まることにもなる場合がある。要注意。

PHPインクルード
トップページ用ファイル、index.php があるとして、同じディレクトリ(この場合、ルートディレクトリ)に、header.html がある場合。

[html]
<?php
include("header.html");
?>
[/html]

contents というディレクトリがあるとして、そこに配置した場合は、当然以下のようになる。

[html]
<?php
include("contents/header.html");
?>
[/html]

includeは、何も考えずに読み込む。
include()ではなく、require()を使っても動作をさせることは可能。
require()でエラーした場合は全ての処理がストップする。→ Fatal Error
include()はエラーしてものこりの処理を表示しようとする。→ Warning

require_once()
 や include_once() という一度だけ読み込むように指定することもできる。

同じソースを二回インクルードする(多重インクルード問題)という問題をさける。
同じファイルを何度も読み込んでしまい、さらに、相互関係にあり、いつまでたっても、その相互関係が解決せずにバグになるという現象。
結論的には、こいつを使いましょう。

[html]
<?php
require_once("header.html");
?>
[/html]

拡張子を指定する理由がないなら、全てのファイルを.phpにしておいてもいいのではないでしょうか。