include_path とは
include_path には、require()、include()、 fopen()、file()、 readfile() および file_get_contents() 関数がファイルを探すディレクトリのリストを指定します。つまり、インクルードパスで指定されたディレクトリ内のファイルは、相対 URL や絶対 URL をつけずにファイル名だけで呼ぶことができます。
例えば、include_pathが librariesで、カレントの ワーキングディレクトリが /web_dir/ の 場合、include/a.php を読み込んで、そのファイルの中に include "b.php" と書いてあったとすると、 b.php がまず /web_dir/librariesで探され、その後、 /web_dir/include/で探されます。 ファイル名が ./ あるいは ../ で始まっている場合は、 カレントのワーキングディレクトリからの相対パスとして探されるのみとなります。
- web_dir
- include
- a.php
- libraries
- b.php
- include
.htaccess でインクルードパスを設定
PHP を Apache モジュールとして使用している場合で php_value が利用可能であれば、.htaccess ファイルでインクルードパスの設定の変更ができます。
複数のインクルードパスを指定する場合は、UNIXでは コロン ':' で、Windowsではセミコロン ';' で区切ったディレクトリのリストを指定します。ここで指定された相対 URL は、.htaccess ファイルが基準ではなく、実行されているスクリプトファイルが基準になります。次の例で最初の '.' は、実行されているスクリプトと同じディレクトリを探すことを意味します。その他のインクルードパスは、実行されるスクリプトのディレクトリ階層はさまざまですので、ルートディレクトリからの絶対パス(フルパス)で指定すれば混乱しないでしょう。また、絶対パスなら、ドメインディレクトリの外にあるディレクトリも指定することができます。
.htaccess UNIXのリモートサーバーの例
.htaccess Windows のローカルサーバーの例
.htaccess でインクルードパスを指定すると、サーバーが設定していたインクルードパスは上書きされて無効になります。設定されているインクルードパスは、get_include_path() で取得できます。したがって、取得したインクルードパスに追加したインクルードパスを記述すれば問題がありません。
ちなみに、ルートディレクトリからの絶対パスは、$_SERVER['SCRIPT_FILENAME'] 又は $_SERVER['DOCUMENT_ROOT'] で取得できます。
.htaccess でインクルードパスが設定できないときの対応方法
レンタルサーバーによっては、.htaccess でインクルードパスの設定が許可されていない場合があります。その場合は、PHP の関数を使いインクルードパスを設定します。インクルードパスを設定するには次の2つの関数があります。$path には、追加したいインクルードパスを代入してください。次の例では、get_include_path() と PATH_SEPARATOR で、現在あるインクルードパスに、新しい $path を追加します。PATH_SEPARATOR は、UNIXでは ':' 、Windowsでは ';' を自動的に選択してくれます。
汎用インクルードパス設定スクリプト
インクルードパスは、ローカルとリモートでは通常設定が異なります。.htaccess でインクルードパスが設定できるときは、ローカルとリモートに異なる .htaccess ファイルを置けば解決します。ところが、PHP でインクルードパスを設定しなければならないときは、ローカルとリモート両方で対応できないと、大変なことになります。
そこで、汎用的にインクルードパスを設定可能な PHP スクリプトを作りました。これに適当なファイル名をつけて、各スクリプトの最初でインクルードして使えば、ローカル、リモート両方で利用できます。このファイルには、'localhost' で追加するインクルードパスと、リモートホストで追加するインクルードパスを記載します。
include_path 追加の汎用 PHP
if ($_SERVER['SERVER_NAME']=='localhost') {//ローカルホスト
$path = 'C:/・・・/web/php/';
} else {//リモートホスト
$path = '/home/・・・/web/php/';
}
set_include_path(get_include_path() . PATH_SEPARATOR . $path);
?>
