簡體   English   中英

在包含中使用$ _SERVER ['DOCUMENT_ROOT']是個好主意嗎?

[英]Is it a good idea to use $_SERVER['DOCUMENT_ROOT'] in includes?

例如,這是一個好主意嗎?

require_once($_SERVER['DOCUMENT_ROOT'].'/include.php');

如果在同一服務器上有兩個虛擬主機,一個用於實時,一個用於開發,具有不同的Apache DocumentRoot,這將避免在包含源未知時包含絕對路徑,並且可能位於任何目錄中。

(注意:以下部分中的文件路徑是相對於Web根目錄的。它們實際上就像/var/www/app/core/init.php ,其中/var/www/app是Web根目錄)

例如:我有一個/ core/init.php,它使用來自整個網站( /file.php / /dir/file.php or /dir/dir/file.php )的相對路徑調用。

然后,這個init.php在基金目錄中包含幾個函數頁面,它們是/core/core/func/userfunctions.php (如/core/func/userfunctions.php )。

所以,在init.php中,我可以使用$_SERVER方法,因為如果我使用相對路徑並嘗試從像/dir/file.php這樣的頁面調用函數,它會中斷。

我看不出有任何問題,但總的來說可能會出錯?

我見過$_SERVER['DOCUMENT_ROOT']未設置或不符合預期的情況(即未在CLI或舊IIS中設置,或在某些CGI設置中無效)。

因此,您可以使用dirname(__FILE__)來獲取調用行的腳本的路徑。然后,您可以從那里引用相對路徑,例如

include dirname(__FILE__) . '/../../other/file.php';

當文件的目錄結構已知且無法更改時,我使用上述方法。

如果DOCUMENT_ROOT不可用,則以下是合適的替代品:

substr($_SERVER['SCRIPT_FILENAME'], 0, -strlen($_SERVER['SCRIPT_NAME']));

你不需要這樣做。 PHP默認情況下在文檔根目錄中查找包含的文件。

您可以使用set_include_path($ new_include_path)來更改此行為,或者在php配置文件中編輯include_path

另外,來自http://php.net/manual/en/reserved.variables.server.php

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

例如,如果您使用URL重寫,當您發現/there/are/so/many/paths/in/the/url/of/this/ you /there/are/so/many/paths/in/the/url/of/this/ page中的包含仍在工作時,您會非常高興!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM