2009-11-18 246 views
13

我讀過,當包括一個php文件,使用絕對路徑比相對路徑處理時間更快。php的相對路徑和絕對路徑

你會建議使用什麼?

include("includes/myscript.php"); 

include("/home/ftpuser/public_html/includes/myscript.php"); 

甚至

set_include_path("/home/ftpuser/public_html/includes"); 
include("myscript.php"); 

或者是它的東西,我真的不應該擔心?

回答

15

我通常設定的常數,通過手動或類似這樣的:

define('ROOT', dirname(__FILE__)); 

然後做

require ROOT . '/include/file.php'; 
+0

如果你有'ROOT',爲什麼不'set_include_path(get_include_path()。PATH_SEPARATOR.ROOT)'? – chelmertz 2009-11-18 11:18:14

+6

因爲那麼你仍然在搜索包含路徑 - 這種方式沒有涉及搜索。 – Greg 2009-11-18 12:03:35

+0

如果你先放置它,這是一個非常簡單/快速的搜索:'set_include_path(ROOT.PATH_SEPARATOR.get_include_path())'。另外,如果要包含大量文件(可在解答中詳細闡述我的意見),可維護性可能會受到影響。) – chelmertz 2009-11-18 12:10:58

1

當不使用絕對路徑時,php會嘗試在所有包含路徑中查找文件,直到找到匹配爲止。

儘可能多的包含路徑可以隨意添加,因此在極少數情況下會導致腳本變慢。
如果你是包括許多文件(例如初始化框架)使用絕對路徑可能會加快腳本有點...

我認爲,當相同的相對路徑/文件名消減發生多它也可能引起併發症時間,因此php選擇第一次發生,當你可能需要另一次發生時

0

這將是很好的你測試所有的方法,通過檢查每個執行所需的時間,個人我從來沒有擔心它並只使用相對路徑。

我想絕對路徑會稍微快一點,它可能值得想知道錯誤發生了什麼,它會吐出你的完整文件路徑到用戶屏幕(顯然關閉error_reporting),這會造成安全風險?

+1

就我所知,它以任何方式吐出完整的文件路徑。這是確定你的意思是「index.php」的唯一方法。 – 2009-11-19 22:05:57

3

絕對不要硬編碼你的路徑,就像選項二一樣。一個好的選擇是:

define('BASE_DIR', '/home/ftpuser/public_html/includes'); 
include(BASE_DIR . '/myscript.php'); 
include(BASE_DIR . '/myscript2.php'); 
include(BASE_DIR . '/myscript3.php'); 
include(BASE_DIR . '/myscript4.php'); 

考慮到你可能不得不介於5和50包括(我猜),我不會真的擔心。只要走相對路徑。包含時間差別甚至不會顯而易見。如果你正在開發一個大型的網絡應用程序,將有數百個,這可能是另一個故事...

2

我傾向於通過設置我的應用程序的初始化包含路徑設置我的包含目錄/庫。

set_include_path("/home/ftpuser/public_html/includes"); 
include("myscript.php"); 

zend框架的做法與加載庫類類似。

8

這是99%的情況下的最佳方法:

include(dirname(__FILE__)."/includes/myscript.php"); 

這最終成爲絕對路徑,這意味着它將忽略include_path,這是一個已知的來源在我的經驗中包括大量的相關的錯誤...

雖然表現明智,但我懷疑絕對和相對路徑之間有很大的差異。這是一種微觀優化,從長遠來看沒有任何意義。 include_path通常只有2-3件東西,除非您添加更多東西。兩個通常的元兇是./以及安裝到pear的任何位置的路徑。

1

最重要的事情是安排包括道路,這樣的require/include -calls量最大被困在第一次提到路徑時不包括通過在首位的絕對路徑的文件。

依賴於通過絕對路徑包含所有內容很難維護,因爲更改庫的路徑意味着單獨更改引用它的所有文件,而不是在一個位置更改包含路徑。

7

我用microtime(true)寫了一個簡單的速度測試腳本。它測試一百萬次迭代以下五種包括方法:

// Absolute path. 
include('/home/ftpuser/public_html/includes/myscript.php'); 

// Predefined path. 
define('PATH', '/home/ftpuser/public_html/includes/'); 
include(PATH . 'myscript.php'); 

// Relative path. 
include('myscript.php'); 

// Using set_include_path(). 
set_include_path('/home/ftpuser/public_html/includes/'); 
include('myscript.php'); 

// Superglobal path. 
include(dirname(__FILE__) . '/myscript.php'); 


哪個結果如下(單位:秒):

 
    Absolute path:   263.222 
    Predefined path:   263.545 
    Relative path:   301.214 
    Using set_include_path(): 302.396 
    Superglobal path:   269.631 


我基於這些結果的意見是使用預定義的路徑,因爲它是絕對路徑中最快的。但是,絕對路徑的缺點是必須在每個文件中更改必要的更改。

希望這有助於。 :)

P.S.
defineset_include_path()在腳本執行過程中僅使用過一次(它們位於循環之外)。