在PHP中存储易于编辑的配置数据的最快方法是什么?

26

如何以最快的方式在PHP中存储配置数据,以便易于更改(通过PHP)?起初我考虑过使用config.php文件,但我无法很简单地使用PHP实时编辑它。然后我想到了使用XML文件,但每个HTTP请求都需要解析它们,这太麻烦了。所以,我想到了INI文件,但后来我发现INI文件仅限于int / string值。最后,我得出结论:JSON编码文件是最好的选择:

$config['database']['host'] = ...;
$config['another']['something'] = ...;
...
json_encode($config);

由于JSON可以存储数组,我可以使用它创建相当复杂的配置,并且它解析速度比INI文件更快。

我的问题是:我有遗漏吗?或者有没有更好的方法来完成这个任务?

7个回答

43

序列化(Serialize)是存储PHP变量的比JSON更好的选择。

我喜欢使用var_export保存配置文件,并使用include加载配置信息。这使得以编程方式保存配置数据变得容易,并且对于人来说,数据的读写也很容易:

config.php:

return array(
 'var1'=> 'value1',
 'var2'=> 'value2',
);

test.php:

$config = include 'config.php';
$config['var2']= 'value3';
file_put_contents('config.php', '<?php return ' . var_export($config, true) . '; ?>');

更新后的config.php包含以下数据:

return array(
 'var1'=> 'value1',
 'var2'=> 'value3',
);

2
无论如何,找到一种将其放入全局变量中的方法都可以起作用。 - leepowers
2
哦,我怎么能忘记 var_export()! - Tower
1
通过字节码缓存(例如APC,XCache,Zend等),我预计这种方法比解码配置字符串更快。配置数据很少更改 - 因此加速器可以为文件使用长时间的缓存生命周期。当配置数据存储在单独的文本文件中时,PHP必须通过JSON或反序列化解码器解析该字符串以进行每个请求,以及打开/关闭每个请求的文件句柄。当然,如果没有基准测试,这一切都是学术性的。 - leepowers
有人可以发表意见,比较序列化-写入-读取-反序列化和"<?php return " . var_export(...)-写入-包含"的区别吗?序列化比解析JSON更快,但是包含本地PHP代码呢,有没有使用opcode缓存的情况下的差异? - nshew13
根据以下链接,serialize 在处理大数据集时表现最佳,而 JSON 是最快的。始终确保对自己的代码进行基准测试:http://techblog.procurios.nl/k/n618/news/view/34972/14863/cache-a-large-array-json-serialize-or-var_export.html#results - leepowers
显示剩余5条评论

2

3
最快的方式是使用+1,但串行化的PHP字符串不易阅读。如果你想做比串行化PHP字符串更用户友好的事情,我建议使用JSON或考虑使用YAML。请注意,不要改变原意。 - Andrew Noyes
1
我知道serialize(),但我不知道为什么要使用它而不是json_encode()。它对于对象更好,但对于配置数据并不需要。JSON也更快。 - Tower
@Tower - JSON主要是为了与JavaScript(JavaScript对象表示法)配合使用而设计的,json函数需要安装PHP JSON扩展。serialize是PHP核心的一部分,因此始终可用。我已经对两者进行了基准测试,在某些测试中json更快,在其他测试中serialize更快。无论哪种方式,差异都微不足道。如果您希望配置文件可以由PHP和手动编辑,则选择JSON或其他格式,否则应使用本机序列化函数。 - Inspire
@Inspire,我认为您将“PRIMARILY设计用于与javascript合作”和“ORIGINALLY设计用于与javascript合作”混淆了。JSON已被广泛采用,现在是跨平台标准。 - voidstate

2

我存储配置的方式是将一些变量放在外部的.php文件中,然后当我想要使用这些文件时,我会这样说:

<?php include("fileName"); ?>

这将允许您在许多页面之间共享配置信息。但我不确定这是否是最有效的方法,但对我来说似乎是最简单的。


8
小提示:如果你让配置文件return它的数组,你可以像这样加载值:$config = include('filename'); - Geert

2
虽然这种方法可能有些过度,但我通常会使用PHP类将配置数据存储在数据库中,并控制名称/值对的更改。(即:没有从该类外部直接访问数据库。)当调用PHP配置类以更改值时,它会写出一个包含所有各种定义值的标准PHP包含文件。因此,在读取配置数据时不会有加载时间性能损失,并且可以通过CMS模块在数据库中更改所有配置数据。

这些配置数据必须在任何数据库连接之前加载。其中一个原因是,没有配置数据,应用程序不知道如何连接到数据库。 - Tower
@Tower - 请仔细阅读我的话 - 配置数据被写入一个标准的 PHP include 文件中。(数据库仅用于存储生成 include 文件所需的“主”值。)如果您想将数据库配置信息存储在其中,那么您需要以某种方式引导它。 - John Parker

0

我使用一个带有名为config或settings的表的数据库。该表有两列:

name [varchar(255)]
value [varchar(255)]

这允许轻松存储int、float和短字符串。

然后我创建了两个函数,GetSetting和SetSetting。它们分别存储一行和检索一行。我发现这极大地简化了值的存储。


1
这些配置数据必须在任何数据库连接之前加载。其中一个原因是,没有配置数据,应用程序不知道如何连接到数据库。 - Tower
在我的情况下也是如此。我只是将数据库配置存储在类似于dbconfig.php的文件中,包括$user = 'username'、$pass = 'password'等内容。这样做,我只需要存储足够连接到数据库所需的信息,而其余部分都在数据库中。 - Nathan Osman

0

我相信你对于 int/string 类型的值是正确的,JSON 是一种方式,但为了速度优化,将字符串进行序列化和反序列化会更快:

这个链接可以帮助你:

http://docs.php.net/serialize


1
你为什么说序列化更快?我进行了一些测试,发现JSON比serialize()快约20%。 - Tower

0
如果你使用 require 而不是 include 导入配置文件,你将会获得一点性能提升。你可以这样做,如果你知道配置文件总是存在的,或者当你有自己的机制来检查它是否存在时。

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