PHPを使用して開発する場合、 get_include_path()とinclude()は、しばしば一緒に表示される2つの関数です。ただし、場合によっては、開発者が混乱する問題に遭遇する可能性があります。Pathはcontruct_pathに追加されていますが、 conter()を使用してファイルを見つけることはできません。この「紛争」は、実際にはいくつかの一般的な理由によって引き起こされます。この記事では、ソリューションを1つずつ分析および提供します。
phpのinclude()関数は、指定されたファイルを次の順序で探します。
相対パスを使用します(現在のファイルのディレクトリに対する)
現在のスクリプトが配置されているディレクトリを見つけます
include_pathで構成されたパスを繰り返します
get_include_path()は、current include_path構成を取得するためのツールです。これを使用して、現在の設定を表示できます。
echo get_include_path();
また、 set_include_path()を介してinclude_pathを動的に変更することもできます。
set_include_path(get_include_path() . PATH_SEPARATOR . '/usr/local/lib/php');
set_include_path()が呼び出されることもありますが、パスは実際には追加されていません。一般的なエラーは次のとおりです。
set_include_path('/some/path');
set_include_path('/another/path'); // 前の設定を上書きします
解決:
Path_separatorを使用して、上書きの代わりにパスを追加します。
set_include_path(get_include_path() . PATH_SEPARATOR . '/another/path');
include( 'config/config.php')が呼び出される場合、 config/config.phpが既にinclude_pathにある場合でも、PHPは現在のスクリプトディレクトリに従って最初に検索を開始します。現在のディレクトリ構造が正しくない場合、「ファイルが見つかっていない」というエラーも発生します。
解決:
パスのディレクトリパーツを削除し、 include_pathを有効にします。例えば:
include('config.php'); // config.php すでにここに include_path パスで
include_pathが正しく設定されていても、ファイルが存在しないか、読み取り権限がない場合でも失敗します。
トラブルシューティングの提案:
ファイルパスが正しいことを確認するには、コマンドラインのlsまたはfile_exists()でそれを確認することを試みることができます。
echo file_exists('/path/to/config.php') ? 'found' : 'not found';
PHPユーザーが許可を読み取っていることを確認するには、サーバーの許可設定を確認してください。
PHPは、次のようなURLを介したリモートファイルを含むサポートをサポートしています。
include('http://gitbox.net/includes/header.php');
この関数は、2つの構成項目Allow_url_includeとaopl_url_fopenに依存しており、多くのサーバーはデフォルトで閉じた状態にあります。
解決:
これらの設定をphp.iniで有効にします:
allow_url_fopen = On
allow_url_include = On
ただし、セキュリティ上の理由から、特にHTTPプロトコルを使用して、生産環境にURLを含めることを有効にすることは推奨されません。
絶対パスを使用するか、 __dir__定数を使用して相対パスを構築してください。
include(__DIR__ . '/includes/config.php');
include_pathの使用AutoloadまたはFrameworkの使用:最新のフレームワークは通常、PSR-4などの自動負荷メカニズムを使用して、クラスファイルの配置場所を自動的に見つけ、マニュアルにエラーを含めないようにします。
展開段階でのテストを含む_Pathの設定:開発環境と生産環境の経路はしばしば異なります。オンラインになる前に完全なパステストを行うことをお勧めします。
get_include_path()はinclude()と競合しませんが、それを使用する間違った方法は、それらが「戦い」のように見えます。検索メカニズムと読み込み順序を理解することは、問題を解決するための鍵です。 comationally include_pathの設定により、書き込みはパスを正しく含み、リモートファイルを含むためのURLの使用を回避するため、コードの堅牢性とセキュリティを大幅に改善できます。