php中的相对文件路径

时间:2013-01-27 01:48:27

标签: php apache windows-7 xampp

简短版本:
相对路径如何在php中工作?


长版:
我有一个本地网站( http://test.com ),E:\test\是其文档根目录。这是我的目录树:

  1. E:\测试\ 001.php
  2. E:\测试\ exit.php
  3. E:\测试\ death.txt
  4. E:\测试\ MySQL的\ first.php
  5. E:\测试\ MySQL的\ death.txt
  6. E:\测试\ MySQL的\ exit.php
  7. 文件内容:

    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.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,php 5.3在Win7 x64上测试此代码。

2 个答案:

答案 0 :(得分:3)

这就是php.net上的文档描述PHP include搜索机制的方式:

  1. 首先,它会查看include_path: http://php.net/manual/en/ini.core.php#ini.include-path
  2. 然后,如果在include_path中找不到任何内容,它将尝试将文件加载到调用脚本自己的目录中。 (在我们的 case,根目录)
  3. 最后,如果其他一切都失败了,它将尝试在当前目录中找到该文件。
  4. 当我运行你的脚本时,我的包含路径默认设置为.:(当前目录,没有其他内容),所以当我尝试从death.txtexit.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');