如何为PHP应用程序存储配置——使用XML、INI或数据库

11

我有一个用PHP编写的应用程序,其中有许多可配置变量。我们正在实现一项功能,使用户可以创建一组配置并轻松地在它们之间切换。我应该如何存储我的配置?以XML形式?在.ini文件中?在多个.ini文件中?还是在数据库中?

如果我们将来添加字段,哪种方法提供的灵活性最大?又哪种方法更方便编码?

如果我使用数据库,我将不得不使用与应用程序主要数据库分开的独立数据库,原因不值得一提,这使我望而却步。(此外,我们正在使用.mdb文件作为我们的数据库。)

我一直在使用XML,但我在使用SimpleXML添加和编辑配置时遇到问题。另外,该应用程序必须与php 5.1.6兼容,我对某些功能有些紧张。

从未真正处理过创建自定义ini文件....

需要澄清的是:用户不会触及这些文件——他们不熟悉技术。因此,我们将由我们来设置初始文件,然后编写一个工具,将他们的配置写入我们选择的任何格式。

7个回答

5

我会将配置项存储在一个PHP文件中。这是我使用过的最灵活的方法。

$config['website_url'] = 'google.com';

接下来我有以下文件结构:

- config/development
- config/production

我在软件中早期定义了一个常量,名为IN_PRODUCTION,当它为TRUE时,加载生产配置项,反之亦然。

这很简单且易于维护。

-Mathew


2
请注意,如果您将配置变量存储在ini文件中,可以很容易地将数据获取到关联数组中。$config = parse_ini_file("config.php"); - TJ L
我知道parse_ini_file()函数,但是如何将修改后的配置写入文件呢?(在php.net的评论中看到过各种类似的代码,但没有找到一个原生函数能够实现这个功能。) - sprugman
1
我曾经在某个地方读到,json_decode和file_get_contents函数一起使用的速度几乎与parse_ini_file函数本身一样快。这让我想知道为什么json不会成为php中存储配置的更常见选项。它肯定比xml更友好,比ini更简洁。此外,json是类型感知的,即十进制数可以被解析为数字而不是字符串。他们可能会在未来的php版本中推出一个更快的parse_json_file函数。 - Michael Ekoka

4
在不同的数据库中存储一个数据库的设置并没有太多意义,以我个人看来。我会选择一个ini文件、一个xml文件或一个php文件,正如jmucchiello所提出的。每种选项都有其优缺点。就xml与ini而言,xml提供了更多的灵活性,但难以维护(可读性较差)。如果你的需求可以通过ini满足,那么就坚持使用更简单的解决方案。只有当您需要比ini文件提供的更多时才使用xml。至于php解决方案,我认为可读性介于ini和xml之间,但保存当前设置将更加困难。因此,尽管我喜欢这种方法,但对于您目前的情况,我不建议使用它。

另一个值得一提的点是,带有语法错误的config.php文件会导致应用程序崩溃,有时还会泄漏错误(因为配置文件本身成为应用程序的一部分)。使用.xml或.ini允许您编写解析器代码,以更优雅地从配置内部的语法错误中恢复。 - Andy Fusniak

2
实际上,我更喜欢可运行的PHP文件作为配置文件。您可以在可运行文件中做很多事情,而使用其他解决方案可能无法轻松完成。唯一的缺点是管理员必须懂PHP才能安全地编辑文件。由于它是代码,因此PHP还可以描述您配置中的复杂数据类型。
DB是一个问题,因为您仍然需要外部配置文件来查找和连接到数据库。
XML对于配置文件来说过于冗长。
INI文件可以工作,您可以使用PHP ini库来读取它们。请参见parse_ini_file()。但是ini文件不能很好地处理复杂的数据类型。
回答Itay Moav的问题(评论无法正确格式化):
<?php /* my config file */

$_CFG = Array(); /* problem solved */
$_CFG['key1'] = 'value1';
?>

1
如果你不小心在全局范围内引入了脏数据,那就有风险了。而如果全局寄存器恰好被打开,那么你将面临严重的安全威胁。 - Itay Moav -Malimovka
无论如何,您的配置可能会在全局范围内。这就是为什么它是配置。在配置文件顶部简单使用$_CFG = Array();可以解决register_globals问题。 - jmucchiello
我们真的不必担心安全问题 - 这将被编译成本地运行的应用程序。 - sprugman
看起来对于这个解决方案,我将不得不编写一个自定义的CRUD例程来保持文件更新。我希望能够使用更自动化的东西。 - sprugman
这个 PHP 文件是用于不经常更改的内容。它确实是一种只需编写一次的格式。当然,您也可以同时使用 PHP 和数据库(或 INI 和数据库等)。不知道具体情况很难知道什么是好主意,什么不是。 - jmucchiello
+1 感谢 parse_ini_file,我之前不知道这个函数。 - Marco Demaio

2

我刚刚看到了一个与此问题相同的帖子,以下链接提供了一个好的解决方案。收集有用代码是一个很好的实践,我认为。 :)

点击iniHandler类获取INI处理程序类!


1

我认为这里的答案实际上取决于您个人的情况。每种选项都有适用的情况。对于您的特定情况,xml 可能是最好的选择。但是,如果您有多个相关选项,xml 真正闪耀的地方就在于此。例如,如果您需要保存数据库连接信息,则在该特定连接的节点下面拥有不同部分的节点可以更容易地阅读和维护。这真的取决于数据。

我还想说,如果您只想提取单个值而不是在应用程序开始时将整个文件加载到内存中,则 xml 文件会更容易使用。


0

我会选择使用ini文件,它们易于人类阅读,解析速度非常快(如果你使用缓存的话...)。
绝对不会选择XML。它不太容易被人类阅读,解析速度也不够快。
我不会使用数据库,因为速度不够快。
我也不会使用PHP变量,因为它会让你使用全局作用域...


0
编写自己的配置类,以加载配置文件。CodeIgniter处理配置的方式是一个很好的例子。

http://codeigniter.com/user_guide/libraries/config.html

它默认加载一些配置文件,或者您可以使用 Config 类加载特定的文件。

您可以下载源代码,以了解其教育目的。

另一个选项是从数据库生成一个具有配置数组的 PHP 文件。因此,您可以管理所有选项,并在保存时生成该文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接