2013-07-01 205 views
41

我有文件/root/update/test.php。还有一个文件/root/connect.php;此文件有一行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 /阿帕奇

+0

我试图包含config.php相对于你的CWD,它是/ root/update /,并且搜索/root/config.php – user4035

+0

这个:include“../config.php”带你到文件夹是根文件夹的父级。 config.php位于那里吗? – Gimmy

+0

config.php的完整路径是什么? – meiamsome

回答

83

派生你总是可以包括它使用__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'); 

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

+3

如果你打算使用这些常量与相对路径(即'../'),我鼓励你在define()之前用'realpath()'清理它。 –

+1

而不是使用'ROOT_PATH。'.. /'',我会使用'dirname(ROOT_PATH)'。后者会给你一个“更加绝对的”路径。 – Kayla

+0

我已经为这个频繁的错误在这里启动了一个故障排除清单:stackoverflow.com/a/36577021/2873507 –

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']

+0

'define('ROOT_PATH', __DIR __。'/ .. /');',也许? – meiamsome

+1

这绝对是一个很好的建议,当然有效 - 但__DIR__更多是我正在寻找的。 (我不是downvoter) –

+0

我已经为这个频繁的错误在这里开始了一个故障排除清单:stackoverflow.com/a/36577021/2873507 –

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

这里是我做了关于最佳的解决方案,您只需要指定在哪个级别要停止,但问题是,你必须使用此文件夹名称一次。