php - PHP应用程序配置文件存储为 ini,PHP,sql,缓存,PHP类,JSON,PHP数组?

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

我正试图决定存储应用程序配置设置的最佳方式。 有太多的选项。

我见过的大多数应用程序都使用了一个简单的需求和一个包含变量的PHP文件。 似乎还有更先进的技术。

你用了什么最有效的东西? 什么是最安全的?

时间:原作者:10个回答

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 above 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

等等。

现在关于代码,我是一个配置读者界面: 所以你可以有一个内存读取器,数组读取器,数据库读取器等。

和一个使用这些读取器的配置类,允许你从任何类型的源中获得一个配置

原作者:
...