74

我有文件/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/阿帕奇

4

3 回答 3

147

你总是可以使用__DIR__

include(dirname(__DIR__).'/config.php');

__DIR__是一个“神奇的常数”,返回当前文件的目录,不带斜杠。它实际上是一个绝对路径,您只需要将文件名连接到__DIR__. 在这种情况下,由于我们需要提升目录,我们使用 PHP 来提升dirname文件树,从这里我们可以访问config.php.

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

define('ROOT_PATH', dirname(__DIR__) . '/');

在 test.php 中会将您的根设置为该/root/级别。

include(ROOT_PATH.'config.php');

然后应该努力从您想要的位置包含配置文件。

于 2013-07-01T15:18:51.410 回答
1

虽然我感谢您相信绝对路径不是一个选项,但它比相对路径和更新 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'],等派生。

于 2013-07-01T15:09:09.070 回答
1
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;
    }

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

于 2017-07-16T17:47:16.783 回答