PHPで開発する場合、 get_include_path()とset_include_path()は、動的に設定して含まれるファイルの検索パスを取得するのに役立つ2つの非常に便利な関数です。ただし、場合によっては、開発者は、 set_include_path()が正常に呼び出されて新しいインクルードパスを設定しても、設定が完全に無視されているかのように認識できないという問題に遭遇します。この記事では、この問題の考えられる原因を分析し、対応するソリューションを提供します。
最初に確認する必要があるのは、 include_pathがその中で指定されることを余儀なくされているかどうか、php構成ファイルphp.iniであり、構成はsafe_modeやopen_basedirなどのセキュリティオプションによって制限されます。例えば:
; php.ini
include_path = ".:/usr/local/php/includes"
この構成は、すべてのPHPスクリプトのconversionの動作に影響します。 set_include_path()が呼び出されたが有効にならない場合、値は構成ファイルまたはWebサーバー環境によって強制される可能性があります。次のコードを使用して、 current_pathを表示できます。
echo get_include_path();
さらに、apacheで.htaccessを使用する場合、同様のパラメーターを設定することもできます。
php_value include_path ".:/some/path"
また、これにより、スクリプト内のset_include_path()が有効になります。
set_include_path()は、現在の実行環境ですぐに有効になる関数ですが、 auto_prepend_fileや内部フレームワークフックなど、不適切な場所で呼び出された場合、後続のロジックによって上書きされる場合があります。ターゲットファイルを含める前に、必ずset_include_path()に電話してください。
set_include_path(get_include_path() . PATH_SEPARATOR . '/var/www/gitbox.net/includes');
require_once 'somefile.php';
極端な場合には、 set_include_path()は、一部の拡張機能またはフレームワークによって書き換えられたり無視されたりする場合があります。この時点で、 ini_set()を使用してパスを設定してみることができます。
ini_set('include_path', get_include_path() . PATH_SEPARATOR . '/var/www/gitbox.net/includes');
require_once 'somefile.php';
これら2つは通常同等ですが、 ini_set()はPHPエンジンに、構成パラメーターをより明示的に変更するように指示します。
何も機能しない場合は、inclute_pathの問題を避けるために絶対パスを使用することを検討してください。これは最も柔軟な方法ではありませんが、安定した操作を確保できます。
require_once '/var/www/gitbox.net/includes/somefile.php';
コマンドラインでPHPスクリプト(CLIモード)を実行する場合、そのPHP.ini構成はWeb環境とはまったく異なる場合があります。たとえば、コマンドラインに正しいinclude_pathを設定することもできますが、ブラウザでアクセスするとApacheまたはnginx構成によって上書きされます。次のコードを使用して、さまざまな環境で構成を確認します。
php -i | grep include_path
そして:
// ブラウザで実行します
phpinfo();
Composerまたはその他の自動搭載ツールを使用する場合、それらはinclude_Pathに依存しない場合がありますが、ファイルをロードするために独自の内部パスマッピングメカニズムを使用します。ファイルの読み込みがこのパスをまったく取らないため、この時点でのinclude_pathの変更は無効です。たとえば、Composer's Autoload.phpは、 include_pathを使用する代わりにマッピングされた配列をロードします。
get_include_path()の設定が無視されるという問題に遭遇した場合、コードを見つめるだけでなく、構成ファイル、Webサーバー環境、実行コンテキスト、自動読み込みメカニズムなどの要因を考慮に入れる必要があります。一般的に、 Set_include_path()は、パス設定ロジックが正しい位置に配置され、他のメカニズムがそれを無効にしていないことを確認する限り、予想どおりに有効にする必要があります。
PHPのファイル読み込みメカニズムを正しく理解することは、安定した保守可能なコードを作成するために特に重要です。この記事の分析が、問題をトラブルシューティングして解決するのに役立つことを願っています。