さて、ここで質問です。 1. ルート ディレクトリで 1.php を実行すると、どのような出力が得られますか? 2. サブディレクトリの下の上位ディレクトリで 1.php を実行すると、どのような出力が得られますか? 3. include_path の現在のディレクトリ パスをキャンセルする場合 (つまり、include_path="path_to_subdir")、上記 2 つの質問の出力はどうなりますか? PHP の include_path PHP は require(_once)/include(_once) 命令に遭遇すると、まず次の判断を行います。 含めるファイルパスは絶対パスですか? その場合は、直接含めて終了します。 そうでない場合は、別のロジックを入力して (複数回呼び出した後、マクロ展開後に _php_stream_fopen_with_path を入力します)、このファイルを見つけます。 次に、_php_stream_fopen_with_pathで以下の判定が行われます。 含めるファイル パスは相対パス (./file、../dir/file の形式、以下の「ディレクトリ相対パス」に置き換えます) ですか? その場合は、include_path のロジックをスキップして、相対パスを直接解析します (後で別途紹介します)。 include_path と現在実行されているファイルのパスに基づいて候補ディレクトリリストが作成されます。 たとえば、前の記事の例では、次のように候補リストが作成されます。 ".:path_to_subdir:current_script_dir"次に、候補リストの先頭からDEFAULT_DIR_SEPARATORに従って候補リスト内のパスを取り出し(この記事の環境は「:」)、このパスの末尾に含めるファイル名を追加します。成功した場合は戻り、それ以外の場合は次の候補パスに進みます。 ここまでで、最初に挙げた 3 つの質問に答えることができます。 1. ルートディレクトリで実行されるため、1.phpに2.phpが含まれる場合、include_pathの第2候補パス(path_to_subdir)が機能し、path_to_subdir/2.phpが見つかりますが、2.phpに3が含まれる場合。 php の場合、現在の作業ディレクトリは root 配下にあるため、3.php がインクルードされると、 include_path "." (現在の作業ディレクトリ) の最初の候補パスに一致するファイルが見つかるため、出力は "root" になります 2. 現在のパスがサブディレクトリであることを除き、1 と同じです。したがって、出力は「subdir」になります。 3. 現在のパスに include_path がないため、ルート ディレクトリで実行するときに 2.php が 3.php にインクルードされると、path_to_subdir が役割を果たすため、ルートでもサブディレクトリでも、「subdir」の出力が得られます。 「。」 2.php の include_path をクリアすると、 ini_set("include_path", ''); require("3.php") ?>
ディレクトリ相対パスの状況を説明するために、別の例を見てみましょう。これは依然として上記のディレクトリ構造ですが、1.php は次のようになります。 ini_set("include_path", "/"); require("./subdir/2.php") コードをコピーします
ルートディレクトリで実行した場合、2.php内の3.phpの検索はカレントディレクトリの相対パスで検索されるため、得られる出力は「root」、サブディレクトリ下で実行した場合は上位の1 php(php -f ../1.php) のディレクトリが検索されますが、subdir 配下に「./subdir/2.php」が見つからないため異常終了します まとめ 1. include_path と相対パスを使用する場合、パフォーマンスは検索回数に関係するため、最悪の場合、include_path が 10 個ある場合、インクルードするファイルを見つけるまでに最大 11 回の再試行が必要になる可能性があります。 、絶対パスを使用できる場合は、絶対パスを使用することをお勧めします。 2. ディレクトリ相対パスの basedir は常に現在の作業パスであるため、使用する場合は実際のデプロイメント パスに関連付ける必要があるため、実際には使用されることはほとんどありません (もちろん、使用される場合もあります)。 chdir を使用してそれを完了するモジュール)。 3. モジュラー システム設計では、通常、モジュールのデプロイメント パスを取得することによってモジュール内で絶対パスを使用する必要があります (dirname(__FILE__)、php5.3 以降では __DIR__ 定数が提供されます)。 |