PHP包括相对路径

时间:2013-07-01 15:03:46

标签: php

我有文件/root/update/test.php。还有一个文件/root/connect.php;这个文件有一行

include "../config.php";

在/root/update/test.php中。有代码

set_include_path(".:/root");
include "connect.php";

当我运行/root/update/test.php时,它找到connect.php,但无法找到config.php,给我

PHP Warning:  include(../config.php): failed to open stream: No such file or directory in /root/connect.php on line 2
PHP Warning:  include(): Failed opening '../config.php' for inclusion (include_path='.:/root')

这让我感到困惑,因为警告让我觉得我正在做的一切正确 - 包含路径是/ root,它正在查找存在的文件../config.php(/config.php)。有人可以为我清除这个吗?请注意,由于部署到我无法访问的生产服务器,因此使用绝对路径不是我的选择。

的Ubuntu / Apache的

3 个答案:

答案 0 :(得分:111)

您始终可以使用__DIR__

包含它
include(dirname(__DIR__).'/config.php');

__DIR__是一个'magical constant'并返回当前文件的目录而没有尾部斜杠。它实际上是一个绝对路径,您只需将文件名连接到__DIR__即可。在这种情况下,当我们需要提升目录时,我们使用PHP dirname来升级文件树,从这里我们可以访问config.php

您也可以在此方法中设置根路径:

define('ROOT_PATH', dirname(__DIR__) . '/');
test.php中的

会将您的root设置为/root/级别。

include(ROOT_PATH.'config.php');

然后应该从您想要的地方包含配置文件。

答案 1 :(得分:2)

虽然我感谢您认为绝对路径不是一个选项,但 比相对路径更好,并且更新PHP包含路径。

使用绝对路径和您可以根据环境设置的常量。

if (is_production()) {
    define('ROOT_PATH', '/some/production/path');
}
else {
    define('ROOT_PATH', '/root');
}

include ROOT_PATH . '/connect.php';

如评论所述,ROOT_PATH也可以从当前路径$_SERVER['DOCUMENT_ROOT']等派生而来。

答案 2 :(得分:0)

function relativepath($to){
    $a=explode("/",$_SERVER["PHP_SELF"] );
    $index= array_search("$to",$a);
    $str=""; 
    for ($i = 0; $i < count($a)-$index-2; $i++) {
        $str.= "../";
    }
    return $str;
    }

以下是我提出的最佳解决方案,您只需指定要停止的级别,但问题是您必须使用此文件夹名称一次。