0

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

我所说的动态是指由其他脚本自动更改的设置。

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

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

作为额外的奖励,一些系统可以在多个服务器上共享此数据,因为其中许多设置在多个盒子中使用。但我想我们可以单独处理。

谢谢!

4

5 回答 5

2

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

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

哦亲爱的。

鉴于您提供的信息,MySQL 可能是最佳选择。而且,如果您在数据库上加载了问题,那么尝试对数据使用不同的基质也无济于事。

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

您还可以使用其他工具——nosql 数据库和 memcache 是显而易见的候选者——但是当你已经有一个可用的 MySQL 实例时,它们就没那么有意义了。

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

于 2011-07-20T12:04:57.823 回答
1

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

使用本机解析器

用 C 编写的解析器很可能比用 PHP 编写的解析器快。浮现在脑海中的两个选择是

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

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

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

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

避免“部分”保存

为避免在更新设置时读取部分文件,首先将新设置写入临时文件,然后将此文件移动到设置文件位置(最好mv (1)在 *nix 上使用)。

于 2011-07-20T13:08:39.760 回答
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 ... */
}

这应该是相当安全的。

于 2011-07-20T12:44:15.230 回答
0

我会说ini文件。parse_ini_file()( http://php.net/manual/en/function.parse-ini-file.php ) 是一个出色的函数,它负责读取和写入的答案就在这里:创建 ini 文件,在 PHP 中写入值

于 2011-07-20T11:51:48.360 回答
0

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

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

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

希望这有帮助

于 2011-07-20T11:56:15.637 回答