2010-10-05 59 views
0

我必須處理複雜的目錄層次結構,而且我正面臨包含PHP路徑的常見問題。在PHP中處理包含和複雜的目錄層次結構

我已經搜索了網頁,但是我還沒有找到任何符合我需要的東西。


舉例來說,我使用不絕的簡單目錄結構:在站點根沒有PHP腳本,子目錄的只有一個級別,在這個分段的所有PHP腳本。要包含一個PHP文件,我只是使用相對路徑,始終以「../」就像在這個例子中:

include('../my_subdirectory/my_script.php') ; 

這樣一來,我一定能找到我想要的文件...

但有一些缺點:

  • 我不能有子目錄的多個級別(原因:當一個文件包含一個文件,該文件包含另一個文件,用於包括路徑的第三個文件是不是相對於第二個文件文件的路徑,而是相對於第一個文件的路徑)。
  • 從C++背景的(用手工生成文件),我一直認爲這是一個骯髒的方式做到這一點

所以我想辦法直接從站點根包括文件(不是 $ _SERVER ['DOCUMENT_ROOT']因爲我可能有獨立的網站到這個document_root的子目錄中)。

我希望它是:

  • 集中在只有一個文件
  • 從服務器到另一個便攜式沒有任何變化(如果可能)
  • 保持PHP的包括簡潔大方,沒有複雜的字符串CONCAT,這應該是這樣的: 「包括( 'directory_a/directory_b/my_php_script.php')」

使用包含的.htaccess:

php_value include_path "/var/www/my_website/" 

......除了路徑被硬編碼到.htaccess中,出於某種原因而煩人:在我的情況下,我有網站的產品,開發和測試版本,並且.htaccess被更新(它包含很多其他的東西)。如果可能的話,我想要一個可以在任何地方工作的.htaccess。將include_path設置爲當前.htaccess路徑的東西會很好。

那麼......在PHP中處理include()和複雜目錄層次結構的最佳實踐是什麼?

+0

你包括哪些文件下面$ _ SERVER?也許有一個更好的方法來做到這一點,無論是使用集中式自定義'include_file()'函數或自動加載 – 2010-10-05 12:50:13

回答

2

的一個好方法是使用像這樣的絕對路徑:

腓< 5.3:

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

PHP 5。3:

include(__DIR__. '/yourfile.php'); 
+0

感謝您的答覆,這樣可以避免當一個文件包含一個文件包含另一個文件時的麻煩......但實際上,路徑'/yourfile.php'仍然是相對於當前文件,而不是相對於站點根目錄。 – Cedric 2010-10-05 13:36:22

+0

只需將前面的代碼合併到像'/../yourfile.php'這樣的相對路徑來加入root_path(我希望你可以預期層級) – Spilarix 2010-10-05 13:53:05

0

__FILE__常量總是指向到當前文件的絕對路徑。

如果你這樣做的腳本在站點根:

define("ROOT_DIRECTORY", dirname(__FILE__)); 

並將其包含在每個腳本,你可以很容易做到相對包括:

include ROOT_DIRECTORY."/dir1/dir2/dir3/index.php"; 

,如果你是其中的PHP類的結構,你可能也想看看Autoloading這是偉大的功能。

+0

感謝你的回覆,我會考慮它...例如我仍然更喜歡.htaccess方式(儘管我需要將路徑硬編碼到它中)。 – Cedric 2010-10-06 11:09:39

+0

@Cedric如果你想要可移植性,這是要走的路 – 2010-10-06 11:38:27

0

我認爲處理這個問題的最好方法是在每個環境的vhost或httpd.conf中設置一個「SetEnv指令」。

的httpd.conf:

SetEnv INCLUDES_DIR /var/www/my_website/ 

在每一個PHP文件,你可以使用可變

include_once($_SERVER['INCLUDES_DIR'].'/my_subdirectory/my_script.php'); 
+0

不能在httpd.conf中這樣做,因爲我在同一臺服務器上有許多不同的網站。它或多或少像在.htaccess中寫'php_value include_path「/ var/www/my_website /」'... – Cedric 2010-10-05 13:27:44