PHP の built-in web server で router.php から .phtml ファイル (/A/a) を include したところ、更にそこから別の php ファイル (./B/b) が include されていたのだが、./B/b が include 出来ない。
オプションに -d display_errors=stderr を与えてみたところ、
みたいにしてみたら、
とりあえずマニュアルの
「php include path」でググってみたら、以下のページを見つけた。
ということで、一応、知られてる挙動のようだが、これ割と罠だな。
元のサイトでは、httpd の方で php に回してるので、 /A/a が php で直接実行されてるので問題にならなかったんだと思うが、
router.php から /A/a を実行させるために include したのがまずかったようだ。
include されるファイル内から相対パスで include したい場合は
/A/a はいじりたくないので、これ、どうすれば?
exec するか pushd,include,popd するか?
オプションに -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とか、pwd が router.php の置いてあるディレクトリになっていた。
とりあえずマニュアルの
- PHP マニュアル
- 付録 p/ hp.ini ディレクティブ / コア php.ini ディレクティブに関する説明 # include_path
- 言語リファレンス / 制御構造
- include
- require
「php include path」でググってみたら、以下のページを見つけた。
- バシャログ / 2014-07-11: PHP でファイルをインクルードするときは絶対パスを使おう
ということで、一応、知られてる挙動のようだが、これ割と罠だな。
元のサイトでは、httpd の方で php に回してるので、 /A/a が php で直接実行されてるので問題にならなかったんだと思うが、
router.php から /A/a を実行させるために include したのがまずかったようだ。
include されるファイル内から相対パスで include したい場合は
include(dirname(__FILE__)."/B/b")みたいにするのが無難かなと思うが、
/A/a はいじりたくないので、これ、どうすれば?
exec するか pushd,include,popd するか?
タグ
コメントをかく