require_onceでの相対パス指定で上位階層のモジュールが読み込めない

ハマった問題点

上位階層のlib内にあるモジュールを読み込もうとしたら以下のエラーで参照ができない。

Warning: main(../hoge/a.php) [function.main]: failed to open stream: No such file or directory in 〜/test/lib/d.php on line 〜

b.php内にてモジュールを参照するケース

c.phpをrequire_once ⇒ OKケース

require_once(../lib_master/c.php);

d.phpをrequire_once ⇒ NGケース

require_once(./../../lib/d.php);
上記サンプルの階層イメージ
.test
│
├─hoge
│   └─a.php
│
├─master
│   └─sub
│       ├─b.php
│       └─lib_master
│               └─c.php
│
└─lib
     └─d.php

解決策あれこれ

解決策1 自分自身のパスを取得して絶対位置指定

dirname(__FILE__) によって自身のモジュールの絶対パスを取得し、それからd.phpまでの位置を連結してrequire_onceします。

require_once dirname(__FILE__) . './../../lib/d.php';
解決策2 httpd.confにphp_value include_path指定

httpd.confなどによりサーバ設定を編集できる場合は以下の設定をすることにより解決できます。
VirtualHostディレクティブに php_value include_path を設定する。


ServerName www.x.com
ServerAdmin webmaster@x.com
DocumentRoot /usr/local/apache/xxxx/htdocs

php_value include_path "."

解決策3 .htaccessに設定

.htaccessを編集できる環境の場合は、.htaccessでinclude_pathを上書きします。
共通関数やクラスはインクルード用のディレクトリに設置し、.htaccessに前述のディレクトリをinclude_pathで設定します。