PHP - 应用程序配置文件存储为 - ini,php,sql,缓存,php类,JSON,php数组?
-
05-07-2019 - |
题
我正在尝试确定存储应用程序配置设置的最佳方法。有很多选择。
我见过的大多数应用程序都使用了一个简单的需求和一个包含变量的PHP文件。似乎有更先进的技术。
你用过什么? 什么是最有效的? 什么是最安全的?
解决方案
你可以做的最好的事情是最简单的事情可能有效(php变量)并将其包装在一堂课中。这样,您可以在不更改任何客户端代码的情况下更改实现。创建配置类实现的接口,并使客户端代码使用接口方法。如果您以后决定将配置存储在数据库或JSON或其他任何内容中,则可以简单地将现有实现替换为新实现。确保您的配置类是可测试的并编写单元测试。
其他提示
我们使用名为 Local.php
的文件,该文件从SCM系统中排除。它包含几个常量或全局变量。例如:
// Local.php
class Setting
{
const URL = 'http://www.foo.com';
const DB_User = 'websmith';
}
它可以简单地通过以下方式引用
Setting::URL
如果您需要在运行时设置可写,我建议您使用公共静态变量。
尝试使用此处描述的技术使用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',
),
);
此方法是安全的,可通过操作码缓存(APC,XCACHE)进行缓存。
我发现 Zend_Config 代码>
是一个很好的解决方案。您可以从一个简单的数组中加载配置,来自 INI样式文件,或来自 XML文档。无论您选择哪种,配置对象都是相同的,因此您可以自由切换存储格式。 Zend_Config
对象也可以合并,具体取决于您的应用程序,这可能很有用(服务器配置,然后是每个站点/安装配置)。
与Zend Framework中的大多数(或所有)事物一样,您可以轻松地单独使用 Zend_Config
。
考虑效率,我认为最快的方法是使用数组,因为这需要更少(在这种情况下没有)字符串解析。但是,对于某些人来说,INI / XML格式可能更容易维护。当然,一些缓存会给你两全其美。
此外,使用带有 Zend_Config
的INI文件可以定义彼此继承的配置部分。最常见的用法是继承自“生产”部分的“开发”部分,然后重新定义数据库/调试设置。
至于安全性,将配置文件保留在Web根目录是第一步。将其设为只读并限制访问可以使其更多安全;但是,根据您的托管/服务器配置,您可能会受到限制。
怎么样:
; <?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语法(;)进行注释,因此它不会产生任何影响。
仅举例说明如何实现中央XML / Xpath配置。
class Config {
private static 仅举例说明如何实现中央XML / Xpath配置。
Config::getInstance()
->open('settings.xml')
->getConfig('/settings/module/section/item');
示例电话
<*>singleton;
private $xml;
static function getInstance() {
if(is_null (self::仅举例说明如何实现中央XML / Xpath配置。
<*>
示例电话
<*>singleton) ) {
self::仅举例说明如何实现中央XML / Xpath配置。
<*>
示例电话
<*>singleton = new self;
}
return self::仅举例说明如何实现中央XML / Xpath配置。
<*>
示例电话
<*>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;
}
}
示例电话
<*>在我看来,好的解决方案是ini文件。
我不喜欢使用数组/变量来存储设置的配置文件;这就是为什么:
如果用户意外重命名您的设置变量怎么办?
如果用户在其他地方也定义了具有相似名称的变量,该怎么办?
配置文件中的变量可能会被覆盖在脚本深处甚至包含文件的某些位置
可能还有更多问题....
我喜欢使用ini文件来设置我的php应用程序。原因如下:
这是基于部分的
它更容易
您可以通过友好名称设置值
您不必担心变量被覆盖,因为没有变量。
当然没有变量冲突。
它允许更灵活地指定值的类型。
注意:您需要使用 parse_ini_file 功能来读取ini文件。
最好在PHP本身进行任何核心配置,但如果您使用数据库并且不介意额外开销 - 您可能会发现使用一个额外查询在数据库中存储某些设置时可以灵活处理(假设你正确组织它。)
无论哪种方式,将这些数据存储在JSON,INI,XL等中只是另一种不必要的抽象,现在在网络上做得太多了。你最好的选择是纯PHP,除非你喜欢数据库中某些设置的灵活性。
我可以想到不使用php vars的唯一原因是其他人建议的是你是否需要以受控方式在配置之间切换,因此在切换期间存在数据/行为一致性。例如,如果您正在切换数据库,那么系统可能会被锁定,直到发生切换(为了防止重写,但仍然可以进行脏读)。
如果这样的事情是一个问题,那么你可以在你的应用程序中编写一个特殊的管理页面(仅用于安全性的本地访问),暂时锁定系统,然后在解锁之前读取和部署所有更改。
如果您正在运行一致性很重要的高流量网站,那么您需要考虑这一点。如果您可以在非工作时间或非流量时在非工作时间进行部署,那么php vars或其他标准文本格式就可以了。
我喜欢拥有“命名空间”的想法。或某种树
所以你可以:
db.default.user
或
db.readonly.user
等等。
现在关于代码,我所做的是配置阅读器的接口:所以你可以有一个内存阅读器,数组阅读器,数据库阅读器等。
和一个使用这些阅读器的配置类,允许您从任何类型的源
进行配置