简短版本:
相对路径如何在php中工作?
长版:
我有一个本地网站( http://test.com ),E:\test\
是其文档根目录。这是我的目录树:
文件内容:
E:\测试\ 001.php
<?php
include('mysql/first.php');
?>
E:\测试\ exit.php
<?php
die('What?');
?>
E:\测试\ death.txt
Bonjour
E:\测试\ MySQL的\ first.php
<?php
echo file_get_contents('death.txt');
include('exit.php');
?>
E:\测试\ MySQL的\ death.txt
Hello there
E:\测试\ MySQL的\ exit.php
<?php
die('DONE');
?>
如果我浏览http://test.com/001.php
并且存在E:\test\exit.php
和E:\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,php 5.3在Win7 x64上测试此代码。
答案 0 :(得分:3)
这就是php.net上的文档描述PHP include
搜索机制的方式:
当我运行你的脚本时,我的包含路径默认设置为.:
(当前目录,没有其他内容),所以当我尝试从death.txt
和exit.php
加载时{ {1}}它应该在mysql/first.php
文件夹中搜索当前目录。但是...... 它没有。当前目录应该是./
,但它并没有指向那里......那么这里发生了什么?
PHP非常特别......让我们回滚到我们做的第一个语句。我们mysql/
使用include path
时的PHP解释是什么,实际上是路径解析!那么,看看我们的路径,我们有.
使用我们的include_path无法解释(.
?)任何东西。然后,PHP必须转到第二个路径解析(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.php
但仍然找到death.txt
?它应该找到它们两个,对吧?
嗯,这是因为exit.php
有第二个参数,默认忽略get_file_content
。
如果设置第二个参数:
include_path
然后你会得到预期的结果。
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()
相同的机制(这在php.net上没有正确记录)。并且include
甚至根本没有实现此机制(这解释了为什么我出现了realpath()
。)
希望这有帮助!
答案 1 :(得分: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');