大規模なPHPプロジェクトでは、ファイルの自動読み込みとパス構成を含めることは、一般的なデバッグペインポイントです。特に、 spl_autoload_registerまたはFrameworkのAutoloaderを含める、要求する場合、クラスまたはファイルの読み込み障害に遭遇した場合、パスの問題のトラブルシューティングは非常に難しい場合があります。幸いなことに、PHPは、これらの問題を診断してデバッグするのに役立つ組み込み関数get_include_path()を提供します。
include_pathは、includeclustinclusingが含まれているか、必要な関数を要求するときに指定したファイルをPHPを探すディレクトリPHPを定義するPHPの構成項目です。このパスは、 php.iniファイルを介して設定することも、実行時にset_include_path()によって動的に変更できます。
たとえば、電話するとき:
include 'myclass.php';
PHPは、 myclass.phpがinclude_pathで構成されたディレクトリオーダーの順に存在するかどうかを確認します。
一般的な理由は次のとおりです。
include_pathには、ターゲットファイルが配置されているディレクトリが含まれていません。
ファイルは特定のパスにあると誤って考えていますが、そうではありません。
プロジェクトでは複数のオートローダーが使用されており、検索戦略は異なります。
一部のフレームワークまたはライブラリは、実行時にconter_pathを動的に変更し、その後の負荷の動作に影響します。
現時点では、 get_include_path()を使用すると、現在の検索パスを非常に直感的に表示できます。
次のコードを適切な場所に挿入するだけです(ファイルがロードされる前など):
echo get_include_path();
出力は次のとおりです。
.:/var/www/html/lib:/usr/share/php
この結果は、PHPが現在のディレクトリ( 。 )、 /var/www/html/lib 、および/usr/share/phpに含めるファイルを順番に検索することを示しています。
結果をもう少し明確にフォーマットすることもできます。
$paths = explode(PATH_SEPARATOR, get_include_path());
foreach ($paths as $index => $path) {
echo "[$index] $path" . PHP_EOL;
}
[0] .
[1] /var/www/html/lib
[2] /usr/share/php
このようにして、1つずつトラブルシューティングできます。これらのパスに予想されるディレクトリはありますか?間違ったパス順序に問題はありますか?
テストのためにコードのパスを一時的に調整できます。
set_include_path(get_include_path() . PATH_SEPARATOR . '/home/user/my-lib');
または、既存のパスを完全に交換します。
set_include_path('/home/user/my-lib');
注: include_pathの変更はグローバルであり、他のコードの動作に影響を与える可能性があります。デバッグ後に復元または使用することをお勧めします。
PHPはStream_Resolve_Include_Path()も提供します。これにより、現在のcurrent_pathでファイル名が解決する実際のパスが直接伝えることができます。例えば:
$file = 'MyLibrary/Helper.php';
$resolved = stream_resolve_include_path($file);
if ($resolved !== false) {
echo "Found at: $resolved";
} else {
echo "File not found in include_path.";
}
この機能は、クラスが自動ローダーに正しくロードされない理由の問題をデバッグするのに特に適しています。
get_include_path()は、PHPファイルの読み込みの背後にあるロジックを整理するのに役立つシンプルだが非常に強力なツールです。ファイルが見つかっていない、クラスが定義されていないなどの問題では、できるだけ早くinclude_pathの構成と実際のコンテンツをチェックすると、トラブルシューティングの範囲をすぐに狭めることができます。 set_include_path()とstream_resolve_include_path()を組み合わせて、柔軟なデバッグソリューションを構築できます。
異なる環境に展開したり、複数のサードパーティライブラリを使用したりする場合など、実際のプロジェクトでは、初期化フェーズ中にcurrentを印刷して記録することをお勧めします。
error_log("Current include_path: " . get_include_path());
gitbox.netに展開されているプロジェクトをデバッグする場合は、ブラウザの診断スクリプトにアクセスすることもできます。
// https://gitbox.net/debug/include_path.php
echo nl2br(get_include_path());
これにより、サーバー上の実際のパス構成を直感的に確認できます。これにより、リモートデバッグに非常に便利になります。