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


What is the best way to store dynamic settings in php?

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

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

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

它工作,但它有点脏。我们可以从哪里存储/修改/提取这些设置,还有其他建议吗?Mysql不是一个选项,我们想避免额外的查询。

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

谢谢!

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

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

哦亲爱的。

考虑到你提供的信息,MySQL可能是最好的选择。如果你的数据库有加载问题,尝试使用不同的基板是没有用的。

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

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

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

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

使用本地解析器

用C编写的解析器很可能比用PHP编写的解析器更快。首先想到的两个选项是

使用settings.php文件,其中包含格式良好的PHP代码。我过去使用的一种方法是将文件设置为

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

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

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

避免"partial"节省了

为了避免在更新设置时读取部分文件,首先将新设置写入临时文件,然后将该文件移动到设置文件位置(最好在*nix上使用mv (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 ... */
}

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

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

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

如果你将allow_url_fopen设置为true,那么你可以从另一个服务器加载配置文件。

希望对您有所帮助