PHP開発中、 include_pathはファイル内のパスを設定するためによく使用される重要な構成です。 get_include_path()およびset_include_path()を介して、PHPが検索する場所にファイルが含まれる場所を柔軟に制御できます。ただし、多くの開発者は、これらの2つの機能を使用する際に混乱する問題に遭遇することがよくあります。パスは設定されていますが、ファイルが見つからないというプロンプトを含めるか、必要です。なぜこれがなぜですか?
たとえば、あなたのコードは次のようになるかもしれません:
set_include_path('/var/www/html/libs');
include 'myLibrary.php';
/var/www/html/libs/mylibrary.phpが存在することを確認しますが、実行時に次のエラーが発生します。
Warning: include(myLibrary.php): failed to open stream: No such file or directory
この時点で、パス設定を確認してください。
echo get_include_path();
出力は次のとおりです。
/var/www/html/libs
それは、パスが確かに正しく設定されていることを意味しますが、なぜファイルがまだ見つからないのですか?
設定後にset_include_path()が機能しない理由はいくつかあります。
include_pathを設定した後、どこかに誤って上書きする場合、たとえば:
set_include_path('/var/www/html/libs');
// 他のコード...
set_include_path('.');
後続の設定は前のパスを上書きするため、以前に設定されたパスは機能しません。
解決:
パスを追加するときは、Path_Separatorを使用して元のパスをスプライスします。
set_include_path(get_include_path() . PATH_SEPARATOR . '/var/www/html/libs');
パスが正しく設定されていても、PHPにディレクトリまたはファイルにアクセスする許可がない場合、Includeが失敗します。
解決:
ターゲットディレクトリとファイルの権限がPHPユーザー(通常はwww-dataまたはapache)が読み取ることができることを確認してください。
chmod -R 755 /var/www/html/libs
一部のサーバー構成では、 open_basedirはPHPに特定のディレクトリのみにアクセスするように制限する場合があります。
解決:
php.iniでopen_basedir構成アイテムを確認してください:
open_basedir = /var/www/html/:/tmp/
設定/var/www/html/libsが許容範囲に含まれていることを確認する必要があります。
これは、最も基本的ですが、無視するのが最も簡単な問題です。たとえば、ファイル名のケースエラー、パススペルが間違っています。LinuxSystemsでは、 mylibrary.phpとmylibrary.phpは2つの異なるファイルです。
/var/www/html/libs/functions.phpにあるファイルを含めると、コードが/var/www/html/public/index.phpにあるとします。次のように設定できます。
set_include_path(get_include_path() . PATH_SEPARATOR . '/var/www/html/libs');
include 'functions.php';
より良いアプローチは、 __dir__と組み合わせて相対パスを使用して、展開パスの変更時に問題を回避することです。
set_include_path(get_include_path() . PATH_SEPARATOR . __DIR__ . '/../libs');
include 'functions.php';
または、 spl_autoload_register()を使用して、クラスファイルの自動読み込みを均一に管理します。
spl_autoload_register(function ($class) {
include $class . '.php';
});
set_include_path()で検索ディレクトリを設定します。
set_include_path(get_include_path() . PATH_SEPARATOR . '/var/www/html/libs');
PHPが探しているパスを確認するには、エラーが発生したときにget_include_path()を印刷して、 stream_resolve_include_path()を使用して実際の検索結果を表示できます。
echo stream_resolve_include_path('functions.php');
これにより、パスが設定されていないか、ファイル自体が存在しないかどうかをすばやく判断するのに役立ちます。
include_pathの設定は機能しません。多くの場合、パスの上書き、権限の不十分な、構成制限、スペルエラーなどの問題によって引き起こされます。このタイプの問題を解決するための鍵は次のとおりです。
get_include_path() + path_separatorを使用して、上書きの代わりにパスを追加します。
ターゲットファイルパスが正しく、権限が読み取られていることを確認してください。
サーバー構成にアクセスパスが制限されているかどうかを確認します。
診断を支援するために、 stream_resolve_include_path()などのデバッグ機能を使用します。
これらのスキルを習得した後、 conterce_pathをより適切に利用して、コードのモジュール性と保守性を向上させ、PHPプロジェクト構造をより明確かつ柔軟にします。
その他の例やリソース管理のベストプラクティスについては、 https://gitbox.net/php-resourcesをご覧ください。