簡體   English   中英

使用XML進行PHP配置時的最佳做法?

[英]Best practices when using XML for PHP configuration?

我計划使用XML文檔來存儲我的下一個PHP項目的配置,格式類似於ASP.NET Web.Config文件。 只有兩個問題:

  1. 無法提供給瀏覽器。
  2. 必須在共享主機中可行。

我認為阻止它被提供的最好方法是將文件類型更改為PHP並添加以下注釋:

<?xml version="1.0" ?>
<!-- <?php if(!defined('FW_LOADED')){ exit; } ?> -->
<configuration>
....
</configuration>

這工作正常,但我不認為這是最好的解決方案。

有沒有其他人使用XML來存儲PHP項目的配置? 什么是一些好的替代解決方案(如果沒有定義常量,而不是在退出腳本的文件開頭放置注釋)?


更新:

更改了問題標題以更好地反映我正在尋找的內容。 對於誤導性的原始問題標題,我們深表歉意。 使用XML進行配置不是問題 我在使用XML進行配置時要求最佳實踐。 請停止建議我使用數組或INI文件...

我希望配置文件盡可能簡單易用,即使對於非php開發人員也是如此。 我選擇XML是因為它是語言中立的。 我已經在使用SimpleXML來解析配置(部分)。 我也不擔心編譯或加快速度,因為可以使用memcached或其他實用程序來實現。

迄今為止最好的解決方案是:

  • 將其移出Web根目錄。
    • 可能,但希望保持配置盡可能接近應用程序。
  • 使用htaccess隱藏配置文件。
    • 我不想冒險讓某人破壞.htaccess文件,讓配置文件暴露的風險。

我想聽一下在應用程序中使用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那么冗長,並且具有很好的組合分層配置文件的方法,當你有多個開發環境如devtest時通常需要這些文件。 , 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.

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