[英]Best practices when using XML for PHP configuration?
我計划使用XML文檔來存儲我的下一個PHP項目的配置,格式類似於ASP.NET Web.Config文件。 只有兩個問題:
我認為阻止它被提供的最好方法是將文件類型更改為PHP並添加以下注釋:
<?xml version="1.0" ?>
<!-- <?php if(!defined('FW_LOADED')){ exit; } ?> -->
<configuration>
....
</configuration>
這工作正常,但我不認為這是最好的解決方案。
有沒有其他人使用XML來存儲PHP項目的配置? 什么是一些好的替代解決方案(如果沒有定義常量,而不是在退出腳本的文件開頭放置注釋)?
更新:
更改了問題標題以更好地反映我正在尋找的內容。 對於誤導性的原始問題標題,我們深表歉意。 使用XML進行配置不是問題 。 我在使用XML進行配置時要求最佳實踐。 請停止建議我使用數組或INI文件...
我希望配置文件盡可能簡單易用,即使對於非php開發人員也是如此。 我選擇XML是因為它是語言中立的。 我已經在使用SimpleXML來解析配置(部分)。 我也不擔心編譯或加快速度,因為可以使用memcached或其他實用程序來實現。
迄今為止最好的解決方案是:
我想聽一下在應用程序中使用XML進行配置設置的經驗,以及它們如何阻止配置文件的提供。
這就是我通常對配置文件所做的事情 - 實際上,這是更基本的設置,通常它包含在自定義類中,它將多個配置文件組合到一個配置對象中:
config.php文件:
return array(
'config1'=> 'config1value',
'config2'=> 'config2value',
);
some_page.php:
$config= include('config.php');
if ($config['config1'])
...
配置作為PHP數組存儲在PHP文件文件中,因此它由PHP引擎解析,永遠不會返回到瀏覽器。 (您可以通過將配置文件存儲在Web根目錄之外來進一步保護配置文件,設置mod_rewrite規則以防止提供配置文件/目錄等)
將配置信息存儲在XML文件中會增加將XML文件解析為每個請求的開銷。 高級配置數據的數據庫存儲很好,但也很昂貴(顯然,數據庫不會存儲您的數據庫連接信息,因此您仍然需要一些基本信息的配置解決方案)。 配置數據通常是非常靜態的(很少寫/每次請求讀取),因此它通過memcached或其他緩存方案成熟緩存。
將它們放在文檔根目錄之外,或者如果您不能或不會將其限制為從外部訪問,只需使用Apache mod_rewrite 。 例如:
RewriteEngine On
RewriteRule ^config.xml [R=404,L]
PHP有多個用於讀/寫XML的庫,因此沒有問題。 如果它是相對簡單(平坦)的數據,請考慮使用INI文件。 PHP將parse_ini_file()
作為內置函數,.Net上的任何內容都將讀取.ini文件。
我認為阻止從外部訪問文件的最佳方法是將它們存儲在根Web文件夾之外。
如果您可以將它放在公共文件夾之外,那將是最佳解決方案。 除此之外,cletus指定的mod_rewrite是一個不錯的選擇。
在考慮應用程序配置時,有一個問題要回答誰將要管理它。 如果它將由您作為開發人員進行管理而不期望某些第三方參與其中,最好的方法是將它們保存在PHP數組中,因為最終您總是將任何格式轉換為某種對象或數組。 這樣你就受到了保護,因為除非你打印它,否則它將被解析為PHP而不會顯示在輸出中。
PHP現在有方便的SimpleXML http://php.net/manual/en/book.simplexml.php lib來操作XML數據。 雖然,我更喜歡YAML http://www.yaml.org/作為配置語言,因為它不像XML那么冗長,並且具有很好的組合分層配置文件的方法,當你有多個開發環境如dev
, test
時通常需要這些文件。 , live
。 有各種PHP庫也可用於處理YAML文件。
由於配置包含在每個請求中,您可以將它們以某種方式緩存在內存中,如mamcache,apc或類似內容,以便在每次請求時都不會從磁盤讀取。
關於保護對PHP解釋器.xml或.yml未解析的文件的訪問,正如其他建議的那樣,將其保留在服務文件夾之外,或者使用重寫規則。
我沒有尋找XML配置解決方案的替代品我正在尋找替代我阻止配置文件服務的方式。 我應該更好地表達我的問題。
到目前為止,最好的解決方案是將文件移出Web根目錄或使用htaccess。 在發布之前我已經決定不做其中任何一個,我也應該提到這一點。
沒有人說過在XML文件的頂部使用exit
語句有什么不好的,所以我想我會繼續這樣做,現在。
XML配置很慢。 我想你需要將它們編譯成PHP。 或者使用PEAR_Config來簡化工作。 至於阻止從瀏覽器訪問...簡單的Apache指令與“訂單允許,拒絕拒絕所有”將一起做。 檢查apache文檔。
您可以將xml文件存儲在Web根目錄之外,在這種情況下,如果不登錄計算機的文件系統就無法訪問它,或者您可以使用.htaccess(或等效的IIS)阻止訪問您的config目錄。
共享主機應該允許這兩種方案。
我建議使用普通數組進行配置。 有一個文件:
$conf['item1'] = 'value';
$conf['item2'] = 'value2';
等等..
然后讓文件調用所有這些$ conf項目的文件,並添加路徑或服務器URL或其他內容,並使用var_export將所有數據保存到文件中。
最后,您將擁有一個可以輕松調用的“已編譯”文件。
注意:var_export只獲取數組的內容,而不是它的名字和結尾';'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.