我正试图决定存储应用程序配置设置的最佳方式。 有太多的选项。
我见过的大多数应用程序都使用了一个简单的需求和一个包含变量的PHP文件。 似乎还有更先进的技术。
你用了什么最有效的东西? 什么是最安全的?
你可以做的最好的事情就是可能工作的最简单的事 ( php变量) 和包装在一个类。 这样你就可以在以后更改实现而不用更改任何客户端代码。 创建配置类实现的接口,并使客户端代码使用接口方法。 如果以后决定在数据库或者JSON或者其他地方存储配置,你可以简单地用一个新的实现替换现有的实现。 确保你的配置类是可以测试的并编写单元测试。
使用这里描述的技术尝试使用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 ) 。
我发现 Zend_Config
是一个很好的解决方案。 你可以加载配置从一个简单的数组,从ini文件风格,或从 xml文档。 无论你选择哪种方式,配置对象都是相同的,因此你可以使用 switch 存储格式。 Zend_Config
对象也可以合并,取决于你的应用程序这可能是有用的( 服务器配置,然后是每个站点/安装配置) 。
如同大多数( 或者全部) Zend 框架,你可以很容易地使用 Zend_Config
本身。
考虑效率,我认为最快的方法是使用一个数组,因为这需要更少的( 在这种情况下) 字符串解析。 但是,一个 ini/xml格式可能更易于维护。 当然一些缓存会给你两个世界最好的。
此外,使用 Zend_Config
文件和允许你定义从彼此继承的配置。 最常见的使用是一个'开发'部分从'生产'继承的部分,然后重新定义db/调试设置。
至于安全,保持网络的配置文件 root 是第一步。 只读和限制访问能更加安全;然而,根据你的主机/服务器配置你可能有限能做些什么。
怎么办:
; <?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语法( ;) 注释掉,因此它不会有任何效果。
只是一个如何实现中央 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');