PHP包含相对path

我有文件/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,但没有findconfig.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') 

这让我感到困惑,因为警告使我看起来像正在做的一切 – 包含path是/ root,它正在寻找存在的文件../config.php(/config.php)。 有人可以帮我解决吗? 请注意,由于部署到我无法访问的生产服务器,因此使用绝对path不适用于我。

Ubuntu的/阿帕奇

你总是可以使用__DIR__来包含它:

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

__DIR__是“神奇的”,并返回当前文件的目录,而不会出现斜线。 这实际上是一个绝对path,你只需要将文件名连接到__DIR__ 。 在这种情况下,我们需要提升一个目录,我们使用PHP的dirname来升级文件树,从这里我们可以访问config.php

你也可以在这个方法中设置根path:

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

在test.php会设置你的根在/root/级别。

 include(ROOT_PATH.'config.php'); 

然后应该从你想要的地方包含configuration文件。

虽然我感谢您相信绝对path不是一个选项,但它相对path和更新PHP包含path的更好select。

使用绝对path,可以根据环境设置一个常量。

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

正如所评论的, ROOT_PATH也可以从当前path$_SERVER['DOCUMENT_ROOT']派生

 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; } 

这是我所做的最好的解决scheme,你只需要指定你想停止的级别,但问题是你必须使用一次这个文件夹名称。