2008-08-07 110 views
82

我有一個如下的目錄結構;如何包含需要絕對路徑的PHP文件?

的script.php

INC/include1.php
INC/include2.php

對象/ object1.php
對象/ object2.php

皁/ soap.php

現在,我使用這些對象在script.php/soap/soap.php,我可以移動它們,但是我想要一個特定原因的目錄結構。當執行script.php時,包含路徑是inc/include.php,執行時/soap/soap.php../inc,絕對路徑有效,/mnt/webdev/[project name]/inc/include1.php...但是如果我想將目錄移動到不同的位置,這是一個醜陋的解決方案。

那麼有沒有辦法使用相對路徑,或者一種方式來編程生成"/mnt/webdev/[project name]/"

回答

138

這應該工作

$root = realpath($_SERVER["DOCUMENT_ROOT"]); 

include "$root/inc/include1.php"; 

編輯:通過aussieviking

+0

要小心,如果您通過Web服務器執行該腳本,該腳本將填充`DOCUMENT_ROOT` – Phil 2013-12-22 23:03:37

+0

只是一個問題,爲什麼RealPath()爲$ _SERVER [「DOCUMENT_ROOT」]?這不應該總是輸出規範的路徑嗎? – 2015-11-15 00:30:30

6

您可以使用到項目根目錄的路徑定義常量,然後將其放在路徑的開頭。

40

您可以使用相對路徑。嘗試__FILE__。這是一個PHP常量,它總是返回腳本它是在路徑/文件名,以便在soap.php,你可以這樣做:

include dirname(__FILE__).'/../inc/include.php'; 

的完整路徑和文件 的文件名。如果在包含內部使用,則會返回包含文件的名稱 。 由於PHP 4.0.2,__FILE__總是 包含一個絕對路徑, 符號鏈接已解決,而在舊版本的 版本中,它在一些情況下包含相對路徑 。 (source)

另一個解決方案是設置一個包括在httpd.conf或.htaccess文件路徑

1

我認爲最好的方法是把你的包含在你的PHP包含路徑中。根據您的設置,有多種方法可以做到這一點。

然後,你可以簡單地從任意文件中參考

require_once 'inc1.php'; 

無論在哪裏,它是你是否具備或在你的網絡訪問文件,或嵌套子目錄的任何水平。

這使您可以將您的包含文件放在Web服務器根目錄之外,這是最佳做法。

例如

site directory 
    html (web root) 
     your web-accessible files 
    includes 
     your include files 

此外,檢查出__autoload類文件

http://www.google.com/search?q=setting+php+include+path

http://www.google.com/search?q=__autoload

0

@Flubba的延遲加載,這也讓我有文件夾在我的include目錄?平面包含目錄給我做惡夢。因爲整個對象目錄應該位於inc目錄中。

哦,是的,絕對。因此,例如,我們用的子文件夾的單層,一般爲:

require_once('library/string.class.php') 

你必須要小心,依託包括路徑非常高流量的網站太多了,因爲PHP已經通過當前目錄打獵和然後在包含路徑中的所有目錄,以查看您的文件是否在那裏,如果您受到敲打,這可能會減慢速度。

因此,舉例來說,如果你正在做的MVC,你把路徑應用程序directoy在包括路徑,然後指定是指事物的形式

'model/user.class' 
'controllers/front.php' 

或什麼的。

但是一般來說,它只是讓你在你的PHP中使用真正短的路徑工作,它可以在任何地方工作,並且比所有實際路徑文檔根malarkey更容易閱讀。

其他人建議的那些基於腳本的替代方案的好處是它們可以在任何地方工作,即使在共享的盒子上也是如此;設置包含路徑需要多一點思考和努力,但正如我提到的,讓你開始使用最酷的__autoload。

3

另一種選擇,與凱文的,是用__FILE__,而是從內它替換php文件名:

<?php 

$docRoot = str_replace($_SERVER['SCRIPT_NAME'], '', __FILE__); 
require_once($docRoot . '/lib/include.php'); 

?> 

我一直在使用這一段時間。唯一的問題是有時你沒有$_SERVER['SCRIPT_NAME'],但有時候會有另一個變量類似。

4

解決這個問題的另一種方法是刪除任何需要包含的東西,即使用autoload功能。包括您的腳本需要的一切「在案例中」可能會妨礙性能。如果您的包含文件全部是類或接口定義,並且只想在需要時加載它們,則可以使用自己的代碼重載__autoload()函數以查找適當的類文件並僅在調用它時加載它。下面是從手冊中的例子:

function __autoload($class_name) { 
    require_once $class_name . '.php'; 
} 

$obj = new MyClass1(); 
$obj2 = new MyClass2(); 

只要你設置你的include_path變量,因此,您再也不需要包含類文件。

3

我發現這個工作得很好!

function findRoot() { 
    return(substr($_SERVER["SCRIPT_FILENAME"], 0, (stripos($_SERVER["SCRIPT_FILENAME"], $_SERVER["SCRIPT_NAME"])+1))); 
} 

用途:

<?php 

function findRoot() { 
    return(substr($_SERVER["SCRIPT_FILENAME"], 0, (stripos($_SERVER["SCRIPT_FILENAME"], $_SERVER["SCRIPT_NAME"])+1))); 
} 

include(findRoot() . 'Post.php'); 
$posts = getPosts(findRoot() . 'posts_content'); 

include(findRoot() . 'includes/head.php'); 

for ($i=(sizeof($posts)-1); 0 <= $i; $i--) { 
    $posts[$i]->displayArticle(); 
} 

include(findRoot() . 'includes/footer.php'); 

?> 
2
require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/path/to/file.php"); 

我用這行代碼。它會返回到站點樹的「頂部」,然後轉到所需的文件。

例如,假設我有這個文件樹:

domain.com/aaa/index.php
domain.com/bbb/ccc/ddd/index.php
域。 COM/_resources/functions.php中

我可以包括從不管我在哪裏的functions.php文件,只需通過複製粘貼

require(str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))."/_resources/functions.php"); 

如果您需要多次使用此代碼,您可以創建一個函數返回str_repeat('../',(substr_count(getenv('SCRIPT_URL'),'/')-1))部分。然後在你包含的第一個文件中插入這個函數。我有一個「initialize.php」文件,我將它包含在每個php頁面的頂部,幷包含這個函數。接下來的時間,我必須包括文件,我其實只是使用功能(命名path_back):

require(path_back()."/_resources/another_php_file.php"); 
0

較短方式

include($_SERVER['DOCUMENT_ROOT']."/inc/include1.php"); 

「DOCUMENT_ROOT」:文檔根目錄下,其正如服務器的配置文件中所定義的,當前腳本是 正在執行。

相關問題