1

短いバージョン:
相対パスはPHPでどのように機能しますか?


長いバージョン:
私はローカルWebサイト(http://test.com)を持っており、E:\test\ そのドキュメントルートです。これは私のディレクトリツリーです:

  1. E:\ test \ 001.php
  2. E:\ test \ exit.php
  3. E:\ test \ death.txt
  4. E:\ test \ mysql \ first.php
  5. E:\ test \ mysql \ death.txt
  6. E:\ test \ mysql \ exit.php

およびファイルの内容:

E:\ test \ 001.php

<?php

include('mysql/first.php');

?>

E:\ test \ exit.php

<?php
die('What?');
?>

E:\ test \ death.txt

Bonjour

E:\ test \ mysql \ first.php

<?php
echo file_get_contents('death.txt');
include('exit.php');
?>

E:\ test \ mysql \ death.txt

Hello there

E:\ test \ mysql \ exit.php

<?php
die('DONE');
?>

私が閲覧http://test.com/001.phpE:\test\exit.phpE:\test\death.txt存在する場合、私はこれを取得します:

BonjourWhat?

そして、それらが存在しない場合:

Warning: file_get_contents(death.txt) [function.file-get-contents]: failed to open stream: No such file or directory in E:\test\mysql\first.php on line 2
DONE

相対パスはphpでどのように機能しますか?両方のファイルに警告を表示するか、適切な出力を表示する必要があると思いました。
私はこのコードをXAMPP、php5.3を使用してWin7x64でテストしています。

4

2 に答える 2

3

これは、php.netのドキュメントがPHPinclude検索メカニズムを説明する方法です。

  1. まず、include_pathを調べます:http: //php.net/manual/en/ini.core.php#ini.include-path
  2. 次に、include_pathに何も見つからなかった場合、呼び出し元のスクリプト自体のディレクトリにファイルをロードしようとします。(この場合、ルートディレクトリ)
  3. 最後に、他のすべてが失敗した場合、現在のディレクトリでファイルを見つけようとします。

スクリプトを実行したとき、インクルードパスは.:デフォルト(現在のディレクトリのみ)に設定されていたため、ロードしようとするdeath.txtexit.php、現在のディレクトリであるフォルダをmysql/first.php検索する必要があります。./しかし...そうではありません。現在のディレクトリはあるはずですmysql/が、そこを指していません...では、ここで何が起こっているのでしょうか。

PHPはそれに関して非常に特別です...私たちが行った最初のステートメントにロールバックしましょう。include pathPHPが使用するときにPHPが解釈するの.は、実際には再びパス解決です。したがって、パスを見ると、include_pathを使用して(再び?)何にも.解釈できないパスがあります。./.次に、PHPは、スクリプトのルートディレクトリである2番目のパス解決(2)に移動する必要があります。(あなたはもう頭痛がしましたか?私がそうするので)

を使用するget_include_path()と、realpath()これを観察できます。

Included path: '.:'
Including mysql/first.php: /Users/Kouno/Development/SandBox/test-php/mysql/first.php
This is what `realpath` returns for './': /Users/Kouno/Development/SandBox/test-php
Getting content of death.txt: /Users/Kouno/Development/SandBox/test-php/death.txt
Bonjour
Including exit.php: /Users/Kouno/Development/SandBox/test-php/exit.php
What?

それでは、ルートディレクトリを削除した後、特にロードに失敗するのに、mysql/death.txtそれでも検索されるのはなぜですか?両方とも見つかるはずですよね?mysql/exit.phpdeath.txtexit.php

これは、デフォルトget_file_contentで無視される2番目のパラメーターがあるためです。include_path

2番目のパラメーターを設定した場合:

echo file_get_contents('death.txt', FILE_USE_INCLUDE_PATH);

次に、期待どおりの結果が得られます。

Included path: '.:'
Including mysql/first.php: /Users/Kouno/Development/SandBox/test-php/mysql/first.php
Getting content of death.txt: (no path returned)
Hello there
Including exit.php: (no path returned)
DONE

面白いのはget_file_content()、と同じメカニズムを使い始めることですinclude(これはphp.netに適切に文書化されていません)。そしてrealpath()、このメカニズムをまったく実装していません(これが私が現れる理由を説明していますno path returned)。

お役に立てれば!

于 2013-01-27T03:59:08.757 に答える
0

first.phpは、E:\ test\mysqlでファイルdeath.txtを検索します。次を使用できます。

echo file_get_contents($_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR . 'death.txt');

また:

echo file_get_contents('..' . DIRECTORY_SEPARATOR . 'death.txt');
于 2013-01-27T02:25:56.243 に答える