ちょっと知っておくといいかもしれないDynamicMTMLで実行するPHPのパス関係
目次
例えば、DynamicMTML 適用ファイル内に書いてある PHP で file_get_contents() とかしようとしたときに、うまく取得できなくてハマったことありませんか?(無いか…)
これって、自分が思っていたのと実行されている PHP でのパスが違うのが原因だったりします。
普通の PHP
ここでいう普通のというのは、DynamicMTMLを介さないで実行されるファイルのことです。
例えば、以下のようなファイルを作成します(汚いコードですいません)。
echo '現在のファイル : $_SERVER["PHP_SELF"]
';
echo '' . $_SERVER['PHP_SELF'] . '
';
echo '絶対パス : __FILE__
';
echo '' . __FILE__ . '
';
echo 'ディレクトリパス : dirname(__FILE__)
';
echo '' . dirname(__FILE__) . '
';
?>
これを、/blog/test/test1.php としてアップロードして表示すると、結果は次のようになります。
現在のファイル : $_SERVER["PHP_SELF"]
/blog/test/test1.php
絶対パス : __FILE__
/var/www/html/blog/test/test1.php
ディレクトリパス : dirname(__FILE__)
/var/www/html/blog/test
結果は予想通りですね。DynamicMTML は、初期設定状態では .php のファイルは適用対象外になっているので、これは普通の PHP ファイルです。
DynamicMTML で実行する PHP
次に、さっきの test1.php の拡張子を .html に変えて、ファイルの先頭に を挿入してみます。 を挿入するのは、MTタグが入っていないと DynamicMTML での実行にならないからです。
echo '現在のファイル : $_SERVER["PHP_SELF"]
';
echo '' . $_SERVER['PHP_SELF'] . '
';
echo '絶対パス : __FILE__
';
echo '' . __FILE__ . '
';
echo 'ディレクトリパス : dirname(__FILE__)
';
echo '' . dirname(__FILE__) . '
';
?>
これを、/blog/test/test1.html としてアップロードして表示すると、結果は次のようになります。
現在のファイル : $_SERVER["PHP_SELF"]
/blog/.mtview.php
絶対パス : __FILE__
/var/www/html/blog/templates_c/%%25^258^2588FBD4%%var%3A_6c74f658cce616ff7677808f2e5ad35a_.php
ディレクトリパス : dirname(__FILE__)
/var/www/html/blog/templates_c
先ほどの結果と全然違いますよね。
ですので、例えばこれらのファイルと同階層に sample.txt というファイルを置いておいて、それを file_get_contents('sample.txt') として読もうとすると、DynaicMTML のもとではファイルが見つからないということになってしまうのです。
こういった場合は絶対パスでファイルを指定してあげるのが安全ですね。
おまけ
これの実験は .mtview.php があるディレクトリの一つしたに test というディレクトリを作って実験しています。もしこれを、 .mtview.php と同じディレクトリで実験すると、どちらも sample.txt が読み込めてしまうので、あれー?ってなってしまうかもしれません。
以上です。