在php中存储动态设置的最佳方法是什么?

时间:2011-07-20 11:49:27

标签: php settings store pull

只是想知道是否有人在php中存储/更新动态设置的好系统?

我的意思是动态是由其他脚本自动更改的设置。

目前我们使用的系统基本上是file_get_contents我们的设置php文件,将其视为字符串,更改设置和file_put_contents更新的设置。

它有效,但有点脏。我们可以存储/修改/提取这些设置的任何其他建议吗? Mysql不是一个选项,我们希望避免额外的查询。

作为一个额外的好处,一些系统可以在多个服务器上共享这些数据,因为许多这些设置都可以在多个框中使用。但我想我们可以单独处理。

THX!

5 个答案:

答案 0 :(得分:2)

您确实不希望将动态数据存储在文件中,特别是在其常见数据中。 PHP没有复杂的文件锁定语义来支持这一点。如果你知道你在做什么,你可以在PHP之上实现自己的咨询定位系统 - 但是如果你知道你在做什么,你就不会问这个问题。

  

Mysql不是一个选项,我们希望避免额外的查询

亲爱的,亲爱的。

根据您提供的信息,MySQL可能是最佳选择。如果您在数据库中加载了问题,尝试使用不同的基材来获取数据将无济于事。

实际上,我建议在自定义数据库绑定会话处理程序中实现值的存储和检索(并为所有请求启用会话)。

您可以使用其他工具 - nosql数据库和内存缓存是明显的候选者 - 但是当您已经有MySQL实例可用时,它们就没有意义了。

(共享内存和APC变量存储与基于文件的存储具有相同的问题)

答案 1 :(得分:1)

如果您不想使用MySql,我认为您现在正在做的是最好的解决方案,任何类型的属性/ ini文件编写系统都会花费更多,并且无法解决并发访问问题。要消除此问题,我建议您将更新的文件写入同一文件夹中的临时文件,删除旧的settings.php并将临时文件重命名为settings.php。在删除settings.php之后和重命名临时文件之前发出请求的可能性很小,可以通过在包含文件时执行类似操作来处理:

if( file_exists( 'settings.php' ) ) {
    include( 'settings.php' );
} else {
    /* ... wait 100 miliseconds or so and try again... do this a few times and then fail ... */
}

这应该是非常安全的。

答案 2 :(得分:1)

如果您坚持使用基于文件的方法,请记住:

使用本机解析器

用C语言编写的解析器很可能比PHP中的解析器更快。 我想到的两个选项是

使用包含格式良好的PHP代码的settings.php文件。我过去使用过的一种方法是使用一个看起来像

的文件
<?php return
array(
'key' => 'value'
);

此文件可以是include - d一次或多次,include语句将返回配置数组。在编写新设置时,使用var_export()获取有效的PHP代码。

另一种方法是使用settings.csv文件。使用fgetcsv()阅读,使用fputcsv()撰写。

避免“部分”保存

要避免在更新设置时读取部分文件,请先将新设置写入临时文件,然后将此文件移至设置文件位置(最好使用* nix上的mv (1)。< / p>

答案 3 :(得分:0)

我会说ini文件。 parse_ini_file()http://php.net/manual/en/function.parse-ini-file.php)是一个很好的功能,负责阅读,写作的答案就在这里:create ini file, write values in PHP

答案 4 :(得分:0)

为此,我们使用:http://projects.jgotti.net/projects/simplemvc/browse/trunk/includes/fx-conf.php 它读取和写入包含键=值对的简单文本文件。

parse_conf_file可以将confs加载为定义的值或返回键值的关联数组。 Write_conf_file允许您通过传递一组键值作为参数来仅覆盖所需的值。

如果您将allow_url_fopen设置为true,那么您可以毫无问题地从其他服务器加载配置文件。

希望这个帮助