php - PHP應用程序配置文件存儲為 ini,PHP,sql,緩存,PHP類,JSON,PHP數組?

  显示原文与译文双语对照的内容
0 0

我正試圖決定存儲應用程序配置設置的最佳方式。 有太多的選項。

我見過的大多數應用程序都使用了一個簡單的需求和一個包含變數的PHP文件。 似乎還有更先進的技術。

你用了什麼最有效的東西? 什麼是最安全的?

时间: 原作者:

0 0

你可以做的最好的事情就是可能工作的最簡單的事 ( php變數) 和包裝在一個類。 這樣你就可以在以後更改實現而不用更改任何客戶端代碼。 創建配置類實現的介面,並使客戶端代碼使用介面方法。 如果以後決定在資料庫或者JSON或者其他地方存儲配置,你可以簡單地用一個新的實現替換現有的實現。 確保你的配置類是可以測試的並編寫單元測試。

原作者:
0 0

我們使用一個名為 Local.php的文件,它被排除在SCM系統中。 它包含幾個常量或者全局變數。 例如:


//Local.php
class Setting
{
 const URL = 'http://www.foo.com';
 const DB_User = 'websmith';
}

可以通過以下方式在任何地方引用 :

 
Setting::URL

 

如果你需要在運行時可以寫設置,我建議你改用公共靜態變數。

0 0

使用這裡描述的技術嘗試使用php-arrays配置文件: http://www.dasprids.de/blog/2009/05/08/writing-powerful-and-easy-config-files-with-php-arrays

這裡方法允許你以這種方式編寫應用程序配置: app.config.php


<?php

return array(
 'appname' => 'My Application Name',
 'database' => array(
 'type' => 'mysql',
 'host' => 'localhost',
 'user' => 'root',
 'pass' => 'none',
 'db' => 'mydb',
 ),
);

這裡方法是安全的,cache-able通過操作碼 cachers ( APC,XCACHE ) 。

0 0

我發現 Zend_Config 是一個很好的解決方案。 你可以載入配置從一個簡單的數組,從ini文件風格,或從 xml文檔。 無論你選擇哪種方式,配置對象都是相同的,因此你可以使用 switch 存儲格式。 Zend_Config 對象也可以合併,取決於你的應用程序這可能是有用的( 伺服器配置,然後是每個站點/安裝配置) 。

如同大多數( 或者全部) Zend 框架,你可以很容易地使用 Zend_Config 本身。

考慮效率,我認為最快的方法是使用一個數組,因為這需要更少的( 在這種情況下) 字元串解析。 但是,一個 ini/xml格式可能更易於維護。 當然一些緩存會給你兩個世界最好的。

此外,使用 Zend_Config 文件和允許你定義從彼此繼承的配置。 最常見的使用是一個'開發'部分從'生產'繼承的部分,然後重新定義db/調試設置。

至於安全,保持網路的配置文件 root 是第一步。 只讀和限制訪問能更加安全;然而,根據你的主機/伺服器配置你可能有限能做些什麼。

原作者:
0 0

怎麼辦:


; <?php die('Direct access not allowed ;')?>
; The 上面 is for security, do not remove

[database]
name = testing
host = localhost
user = root
pass = 

[soap]
enableCache = 1
cacheTtl = 30

保存為 config.php ( 或者類似的,必須有php擴展),然後將它的載入:


parse_ini_file('config.php', true);

你可以使用


array_merge_recursive(parse_ini_file('config-default.php', true), parse_ini_file('config.php', true))

將默認配置文件與更具體的配置文件合併。

這裡的要點是你可以使用非常易讀的ini格式,但是仍然可以將你的配置文件放在公共目錄中。 當你用瀏覽器打開文件時,php會首先解析它並給出結果,這就是";不允許直接訪問;"。 當你直接將文件解析為ini文件時,php die語句將根據ini語法( ;) 註釋掉,因此它不會有任何效果。

0 0

只是一個如何實現中央 xml/xpath配置的示例。


class Config {
 private static $_singleton;
 private $xml;
 static function getInstance() {
 if(is_null (self::$_singleton) ) {
 self::$_singleton = new self;
 }
 return self::$_singleton;
 } 
 function open($xml_file) {
 $this->xml = simplexml_load_file($xml_file);
 return $this;
 }
 public function getConfig($path=null) {
 if (!is_object($this->xml)) {
 return false;
 }
 if (!$path) {
 return $this->xml;
 }
 $xml = $this->xml->xpath($path);
 if (is_array($xml)) {
 if (count($xml) == 1) {
 return (string)$xml[0];
 }
 if (count($xml) == 0) {
 return false;
 }
 }
 return $xml;
 }
}

示例調用


Config::getInstance()
 ->open('settings.xml')
 ->getConfig('/settings/module/section/item');

原作者:
0 0

在我看來好的解決方案是ini文件。

我不喜歡使用數組/變數來存儲設置的配置文件;原因如下:

你如果用戶不小心re-named設置變數是什麼?
如果用戶也在別處定義了具有相似名稱的變數?
配置文件中的變數可能會覆蓋在腳本或者甚至包含文件的部分位置。
可能還有更多問題。

我喜歡使用ini文件設置我的php應用程序。 原因如下:

為基礎
更容易
你可以通過友好名稱設置值
你不必擔心被覆蓋的變數,因為沒有。
當然沒有變數衝突。 它允許在指定值類型時更靈活。

注意:你需要使用 parse_ini_file 函數來讀取ini文件。

原作者:
0 0

最好是在PHP本身做任何核心配置,但是如果你使用了一個資料庫並且不介意額外的開銷- 你可以在資料庫中使用一個額外的查詢( 假設你正確組織它) 來存儲一些設置。

不管怎樣,將這些數據存儲在 JSON,INI,XL等都是一個不需要的抽象,現在已經在網路上做得太多了。 你最好的選擇是純 PHP,除非你喜歡資料庫中某些設置的靈活性。

0 0

我能想到的唯一原因不使用phpvar和其他人之間的建議是如果你需要 switch 配置控制的方式,因此在 switch 數據/行為的一致性。 例如如果你是切換資料庫,那麼系統可以在switch-over發生之前寫入鎖。

如果自己的應用都要考慮的問題,那麼這類事情,你可以寫一個特殊的管理頁面上( 僅對安全使用本地訪問) 臨時系統,以便將控制鎖的,然後讀取並部署你的所有更改,然後解鎖。

如果你正在運行一個高流量站點,其中一致性問題,這是你想考慮的。 如果你可以部署在業餘時間當很少有/沒有交通,那麼phpvar或其他標準文本格式會沒事的。

原作者:
0 0

我喜歡"命名空間"或者某種樹的概念

這樣你就可以:

 
db.default.user

 

或者

 
db.readonly.user

 

等等。

現在關於代碼,我是一個配置讀者界面: 所以你可以有一個內存讀取器,數組讀取器,資料庫讀取器等。

和一個使用這些讀取器的配置類,允許你從任何類型的源中獲得一個配置

...