【问题标题】:What is the best way to store dynamic settings in php?在 php 中存储动态设置的最佳方法是什么?
【发布时间】:2011-10-09 08:05:17
【问题描述】:

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

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

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

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

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

谢谢!

【问题讨论】:

  • 为什么不想完全使用 MySQL?
  • 希望避免额外的 10000000 左右的每日查询。是的,他们会在 99.999% 的时间里访问查询缓存,但我们仍然有一个源库,其中许多 cron 样式脚本甚至连 mysql 都没有连接。
  • 我想知道,使用 file_get_contents 读取文件并解析它(或用它做什么)真的比 MySql 查询便宜吗?
  • 这仅适用于更新。每隔几个小时发生一次。否则,它会通过 include(... 所以明智地阅读它肯定会便宜很多。这些变化很少,非常罕见。

标签: php settings store pull


【解决方案1】:

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

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

哦,亲爱的。

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

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

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

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

【讨论】:

    【解决方案2】:

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

    使用原生解析器

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

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

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

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

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

    避免“部分”保存

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

    【讨论】:

    • 提醒:关于使用 mv 防止部分保存。这确实有效,但请确保源和目标位于同一文件系统上。否则无法使用“inode change”技术。
    • 我投了这个答案,因为我们最终保持原样,只实现 mv 方法以避免部分保存。
    【解决方案3】:

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

    这应该很安全。

    【讨论】:

    • 议会正在决定天气是否要走 mysql 路线。可能会。我决定现在解决这个问题的原因是因为我们需要这些设置在盒子之间共享。和 mysql 接缝是最好的方法。
    【解决方案4】:

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

    【讨论】:

    • 并发访问和频繁更新可能会出现严重错误。 :(
    • 到目前为止,这看起来最有希望。类似于我们现在所做的,但看起来它会简化一些事情。至少就存储/更新/检索而言。我们可以单独处理多台服务器上的同步。
    • 我们的手动文件放置内容方法存在相同的更新问题。一天几次 php 会出现语法错误,因为文件是中间写入的。是的,我们尝试了文件放置内容标志以进行锁定,但无济于事。很抱歉在电话上写的机场缺乏进一步的细节。
    【解决方案5】:

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

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

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

    希望有帮助

    【讨论】:

      猜你喜欢
      • 2010-10-10
      • 2019-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-15
      • 2015-11-23
      • 2013-05-23
      • 2011-02-27
      相关资源
      最近更新 更多