繁体   English   中英

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

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

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

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

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

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

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

谢谢!

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

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

哦亲爱的。

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

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

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

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

如果您不想使用 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 ... */
}

这应该是相当安全的。

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

使用本机解析器

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

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

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

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

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

避免“部分”保存

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

我会说ini文件。 parse_ini_file() ( http://php.net/manual/en/function.parse-ini-file.php ) 是一个很好的 ZC1C425268E68385D1AB50074C17A94F14 文件,写到这里的答案是正确的: PHP 中的值

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

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

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

希望这有帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM