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,你只需要指定你想停止的级别,但问题是你必须使用一次这个文件夹名称。