【问题标题】:What is the best way to persist PHP application setings?持久化 PHP 应用程序设置的最佳方式是什么?
【发布时间】:2010-10-06 07:33:24
【问题描述】:

我正在开发一个小型应用程序,我可能想将其提供/出售给其他人。我想保留一些设置,并创建一个管理界面来修改它们。将它们存放起来的最佳方法是什么?对于我将拥有的 10-20 个设置,DB 表似乎有点过头了,我希望尽可能快地检索这些设置。平面文件是另一个可行的选择吗?使用平面文件有哪些陷阱?与存储多个键和值的平面文件交互的最快/最简单方法是什么?

【问题讨论】:

  • 其实我也遇到了同样的事情,谢谢 Skippy!
  • 很高兴这可以帮助别人!

标签: php database web-applications file-io settings


【解决方案1】:

PHP 具有读取 .ini 文件的功能。

http://is2.php.net/manual/en/function.parse-ini-file.php

【讨论】:

  • 我加倍努力,好心的先生! ;)
  • 英里?更像是额外的脚。 :D
【解决方案2】:

我经常为此使用 PHP 的 parse_ini_file

所以如果你用这个写一个 .ini 文件:

; This is a sample configuration file
; Comments start with ';', as in php.ini

[first_section]
one = 1
five = 5
animal = BIRD

[second_section]
path = "/usr/local/bin"
URL = "http://www.example.com/~username"

[third_section]
phpversion[] = "5.0"
phpversion[] = "5.1"
phpversion[] = "5.2"
phpversion[] = "5.3"

然后用这个 PHP 代码读入:

define('BIRD', 'Dodo bird');
$ini_array = parse_ini_file("sample.ini", true);
print_r($ini_array);

你会得到这个输出:

Array
(
    [first_section] => Array
        (
            [one] => 1
            [five] => 5
            [animal] => Dodo bird
        )

    [second_section] => Array
        (
            [path] => /usr/local/bin
            [URL] => http://www.example.com/~username
        )

    [third_section] => Array
        (
            [phpversion] => Array
                (
                    [0] => 5.0
                    [1] => 5.1
                    [2] => 5.2
                    [3] => 5.3
                )

        )

)

【讨论】:

  • 很棒的反应!快速而完整!谢谢!
  • 我使用单例来处理配置,但这是非常有用的信息。
  • 这不允许您从代码中修改设置,对吧?
【解决方案3】:

考虑一个序列化为文件的 PHP 对象(或数组)。无需编写解析代码,足够快,可扩展。需要注意的是,当您的代码增长以支持更多设置时,请考虑一种“升级”设置文件的策略。

【讨论】:

    【解决方案4】:

    我认为通过 SimpleXMLElement 实现的 XML 对于这类事情非常有用。

    配置(config.xml):

    <config version="1">
      <foo>value</foo>
      <bar>
        <baz>Boo</baz>
      </bar>
    </config>
    

    阅读代码:

    $config = simplexml_load_file('config.xml');
    $version = (int) $config['version'];
    $foo = (string) $config->foo;
    $baz = (string) $config->bar->baz;
    

    将其写入文件的代码:

    $config = new SimpleXMLElement('<config version="1"/>');
    $config->foo = 'value';
    $config->bar->baz = 'Boo';
    $config->asXML('config.xml');
    

    使用平面文件的主要缺陷是它可能导致脚本崩溃或并发编辑时数据损坏。

    【讨论】:

      【解决方案5】:

      这实际上取决于您要存储的“设置”类型。它们是数据库主机、端口和登录等“引导”设置吗?还是它们是专门针对您的应用程序的应用程序设置?

      让管理界面在文件系统上写入文件的问题是写入文件所需的权限。每当您打开 Web 服务器来写入文件时,都会增加代码中的错误可能导致严重的权限提升的可能性。

      数据库旨在允许读取和写入,而不会引入潜在的系统安全风险。

      我们使用“生成”的 PHP 文件来存储静态配置数据(如数据库访问信息)。它由用户在命令行上的实用程序脚本生成。之后,所有非静态信息都存储在数据库表中。反过来,数据库表很容易从管理区域更新。升级应用程序时很容易扩展和升级。

      将需要备份的“数据”集中在一个地方也容易得多。

      我可以建议使用 memcached 或类似的东西来加快速度吗?

      只是一些想法......

      【讨论】:

        【解决方案6】:

        我只是将 PHP 数组用于配置文件。

        <?php 
        return array
        (
            'user' => 'name',
            'pass' => 'word',
            'one_day' => 60 * 60 * 24
        );
        ?>
        

        其中一些优点是,就像 morendil 提到的那样,不需要解析,速度很快,可以存储各种复杂的变量/方程,并且可以执行以下操作:

        <?php
        $config = include 'path/to/file.php';
        ?>
        

        【讨论】:

        • 实际上解析 is 是必需的,有人可能会争辩说,解析和执行 PHP 代码比为 .ini 文件提取字符串更复杂。不过,我同意使用 PHP 是最简单的方法。
        • 我的意思是不用手动解析,加上数组可以缓存在APC中;)
        • 代替数组,使用类不是更好/更快吗?
        • 在那个配置文件中,设置一个单例类,并返回它的一个实例?这行得通吗?
        • 不知道单例的想法你要去哪里。我想说的是,在配置文件中存储一个返回数组,而不是像 ini 这样的纯文本。没有变量声明...
        猜你喜欢
        • 2012-12-25
        • 1970-01-01
        • 2011-11-26
        • 1970-01-01
        • 2010-09-06
        • 1970-01-01
        • 2010-11-20
        • 2010-10-11
        • 1970-01-01
        相关资源
        最近更新 更多