什么是持久化PHP应用程序设置的最佳方式?

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

我其实也遇到了同样的问题,谢谢 Skippy! - helloandre
很高兴这能帮到其他人! - John B
6个回答

15
我经常使用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
                )

        )

)

太棒了的回复!又快又全面!谢谢! - John B
我使用单例来处理配置,但这是非常有用的信息。 - Syntax
这样做不会让你能够从代码中修改设置,对吧? - John B

2

我尽了最大的努力,亲切的先生!;) - Paolo Bergantino
英里?更像是额外的英尺。 :D - Ólafur Waage

2

这要看你想存储什么类型的“设置”。它们是像数据库主机、端口和登录之类的“引导程序”设置,还是应用程序特定的设置?

让管理员界面在文件系统上编写文件的问题在于需要的权限才能写入文件。每当您打开 Web 服务器以写入文件时,都会增加代码中的错误可能性,从而允许严重的特权升级。

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

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

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

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

这只是一些想法...


1

我认为通过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');

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

0
考虑将PHP对象(或数组)序列化到文件。无需编写解析代码,速度足够快,可扩展。唯一的注意事项是考虑一种策略来“升级”设置文件,以便随着代码的增长支持更多设置。

0

我通常使用 PHP 数组来作为配置文件。

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

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

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

实际上,解析是必需的,有人可能会认为解析和执行PHP代码比从.ini文件中提取字符串更复杂。尽管如此,我仍然同意使用PHP是最简单的方法。 - che
我的意思是没有手动解析,而且数组可以在APC中缓存 ;) - Mario
使用类而不是数组,会更好/更快吗? - John B
在那个配置文件中,设置一个单例类并返回其实例?这样行得通吗? - John B
不确定您在单例模式方面的想法。我想要简单地说的是,将返回的数组存储在配置文件中,而不是像ini一样存储纯文本。没有变量声明... - Mario

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