【问题标题】:how to store configurations for php app -- xml or ini or db [closed]如何存储 php 应用程序的配置——xml 或 ini 或 db [关闭]
【发布时间】:2010-10-22 08:52:23
【问题描述】:

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

如果我们在路上添加字段,什么会提供最大的灵活性?编码方便吗?

如果我使用数据库,我将不得不使用与应用程序的主数据库不同的数据库,原因不值得一提,这让我回避了这一点。 (此外,我们正在为我们的数据库使用 .mdb 文件。)

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

从来没有真正处理过创建自定义 ini 文件....

一个小小的说明:用户不会接触文件——他们不是技术人员。所以设置初始文件将由我们完成,但随后我们正在编写一个工具,将它们的配置写入我们选择的任何格式。

【问题讨论】:

    标签: php configuration


    【解决方案1】:

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

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

    然后我有以下文件结构

    - config/development
    - config/production
    

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

    这很简单,易于维护。

    -马修

    【讨论】:

    • 请注意,如果您将配置变量存储在 ini 文件中,则可以很容易地将数据放入关联数组中。 $config = parse_ini_file("config.php");
    • 我知道 parse_ini_file(),但是如何将修改后的配置写入文件? (我在 php.net 上的 cmets 中看到了各种类等,但还没有找到可以做到这一点的本机函数。)
    • 我在某处读到,一起使用的 json_decode 和 file_get_contents 函数实际上与单独使用 parse_ini_file 函数一样快。这让我想知道为什么 json 也不是在 php 中存储配置的更常见的选择。它肯定比 xml 更友好,比 ini 更简洁。此外,json 是类型感知的,即十进制数字可以被解析为数字而不是字符串。他们可能会想出一个 parse_json_file 函数,在未来的 php 版本中会更快。
    【解决方案2】:

    将一个数据库的设置存储在不同的数据库中没有多大意义,IMO。

    按照jmucchiello 的建议,我会选择ini 文件、xml 文件或php 文件。每个选项都有其优点和缺点。至于 xml 与 ini,xml 提供了更大的灵活性,但更难维护(可读性较差)。如果 ini 满足您的需求,请坚持使用更简单的解决方案。仅当您需要超出 ini 文件所能提供的范围时才使用 xml。

    至于 php 解决方案,我认为可读性介于 ini 和 xml 之间,但保存当前设置会更加困难。因此,尽管我喜欢这种方法,但对于您当前的场景,我不会推荐它。

    【讨论】:

    • 还有一点值得一提的是,带有语法错误的 config.php 文件会导致应用程序崩溃,有时还会溢出错误(因为配置文件本身成为应用程序的一部分)。使用 .xml 或 .ini 可以让您编写解析器代码,以便更优雅地从配置中的语法错误中恢复。
    【解决方案3】:

    实际上,我更喜欢一个可运行的 PHP 文件进行配置。您可以在一个可运行的文件中做很多使用其他解决方案无法轻松完成的事情。可运行文件的唯一大缺点是管理员必须精通 PHP 才能安全地编辑文件。 PHP 还可以在您的配置中描述复杂的数据类型,因为它是代码。

    DB 是个问题,因为您仍然需要外部配置文件来查找并连接到 db。

    XML 对于配置来说太过分了。

    INI 文件可以工作,您可以使用 PHP ini 库来读取它们。请参见 parse_ini_file()。 ini 文件虽然不能很好地处理复杂的数据类型。

    编辑回答 Itay Moav(cmets 不会正确格式化):

    <?php /* my config file */
    
    $_CFG = Array(); /* problem solved */
    $_CFG['key1'] = 'value1';
    ?>
    

    【讨论】:

    • 并且您有可能在您的全局范围内有污垢,如果不小心打开了 global-register,那么您将面临严重的安全威胁。
    • 无论如何,您的配置都可能在全局范围内。这就是为什么它是配置。还有一个简单的 $_CFG = Array();配置文件顶部的解决了 register_globals 问题。
    • 我们真的不必担心安全性 - 这是被编译到本地运行的应用程序中。
    • 似乎对于这个解决方案,我必须编写一个自定义 CRUD 例程来保持文件更新。我希望能够使用更自动的东西。
    • 该 php 文件用于保存不变的内容。诚然,它是一种一次写入的格式。您当然可以同时使用 php 和 db(或 ini 和 db 或...)在不知道具体细节的情况下很难知道什么是好主意或不是一个好主意。
    【解决方案4】:

    我刚才看过一篇有同样问题的帖子,这是一个很好的解决方案。 收集有用的代码是一种很好的做法。我想。 :)

    点击iniHandler class获取INI handler类!

    【讨论】:

      【解决方案5】:

      我认为这里的答案将取决于您的个人情况。在某些情况下,这些都是更好的选择。对于您的特定情况,xml 可能是最好的。但是,如果您有多个相关选项,那么 xml 真正在 ini 文件上大放异彩的地方。例如,如果您需要保留具有节点的数据库的连接信息,该数据库的节点用于该特定连接的节点下方的连接的不同部分,则该特定连接可能更易于阅读和维护。这真的取决于数据。

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

      【讨论】:

        【解决方案6】:

        我会选择 ini 文件,它们是人类可读的,它们的解析速度非常快(如果你缓存的话......)。
        当然不是 XML。人类可读性较差,解析速度不快。
        由于速度,我不会做数据库。
        我不会使用 PHP vars,因为它会让你使用 GLOBAL 范围......

        【讨论】:

          【解决方案7】:

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

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

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

          您可以下载源代码并看看他们是如何为教育目的的。

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

          【讨论】:

            猜你喜欢
            • 2014-02-26
            • 2010-09-05
            • 1970-01-01
            • 1970-01-01
            • 2013-12-07
            • 1970-01-01
            • 2013-12-05
            • 2023-03-30
            相关资源
            最近更新 更多