我有文件/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的
答案 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;
}
以下是我提出的最佳解决方案,您只需指定要停止的级别,但问题是您必须使用此文件夹名称一次。