2013-07-01 238 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; 
    } 

這裏是我做了關於最佳的解決方案,您只需要指定在哪個級別要停止,但問題是,你必須使用此文件夾名稱一次。