hack のためのネタ帳, etc,,,

状況

PHP の built-in web server で router.php から .phtml ファイル (/A/a) を include したところ、更にそこから別の php ファイル (./B/b) が include されていたのだが、./B/b が include 出来ない。
オプションに -d display_errors=stderr を与えてみたところ、
Warning: include(./B/b): failed to open stream: No such file or directory in /.../docroot/A/a on line XX
Warning: include(): Failed opening './B/b' for inclusion (include_path='.:/usr/share/php') in /.../docroot/A/a on line XX
みたいに言われる。

/.../docroot/A/c

<?php
echo getcwd();
みたいにしてみたら、
/.../docroot
とか、pwd が router.php の置いてあるディレクトリになっていた。

とりあえずマニュアルの
  • PHP マニュアル
    • 付録 p/ hp.ini ディレクティブ / コア php.ini ディレクティブに関する説明 # include_path
    • 言語リファレンス / 制御構造
    • include
    • require
辺りを眺めてみたんだけど、include 元のディレクトリが基準って記述はなさそうな気がするんだけど?

php include path」でググってみたら、以下のページを見つけた。
ということで、一応、知られてる挙動のようだが、これ割と罠だな。

元のサイトでは、httpd の方で php に回してるので、 /A/a が php で直接実行されてるので問題にならなかったんだと思うが、
router.php から /A/a を実行させるために include したのがまずかったようだ。

include されるファイル内から相対パスで include したい場合は
include(dirname(__FILE__)."/B/b")
みたいにするのが無難かなと思うが、
/A/a はいじりたくないので、これ、どうすれば?
exec するか pushd,include,popd するか?

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

フリーエリア

管理人/副管理人のみ編集できます