【问题标题】:In PHP what is the right approach for loading configuration parameters into application variables?在 PHP 中,将配置参数加载到应用程序变量中的正确方法是什么?
【发布时间】:2009-07-28 21:23:29
【问题描述】:

我有一个保存配置参数的数据库,我只想将配置参数加载到我的应用程序变量中一次(或根据特定请求重新加载参数),我还希望保存配置参数的这些变量是可从所有 php 页面/脚本访问,其想法是保存数据库中的命中并提高应用程序响应时间。 解决这个问题的“经典”php 解决方案是什么?

【问题讨论】:

标签: php configuration


【解决方案1】:

在我看来,这与任何其他缓存问题基本相同。从技术角度来看,要缓存的内容是配置参数而不是网页内容或用户配置文件信息这一事实并不重要。

所以你要做的就是想出一些缓存解决方案,无论是 memcached 还是只是用你想要缓存的数据写入静态文件。

这里的诀窍是,您不是在缓存要呈现给用户的 HTML,而是在缓存数据库查询结果,因此您可能希望查看类似这样的方法:

http://devzone.zend.com/article/1258

【讨论】:

  • +1。 APC 是用于配置变量的最常见的缓存解决方案,因为 (1) 每个请求都需要它们 (2) 它们对于每个请求通常都是相同的 (3) 您希望尽可能快地访问它们。大街上的消息是 facebook 在 APC 中缓存他们的配置变量。您也可以考虑使用“hidef”pecl 扩展:pecl.php.net/package/hidef,但它似乎并没有得到非常积极的维护。
【解决方案2】:

我喜欢使用Zend_Config_Ini 类。创建可以扩展其他部分的单独部分很容易,并且使用Zend_CacheZend_Cache_Frontend_File(检查.ini 文件的更新)和一个访问速度特别快的后端(我使用APC)以避免任何重新开销-解析。

; Production site configuration data
[production]
webhost                  = www.example.com
database.adapter         = pdo_mysql
database.params.host     = db.example.com
database.params.username = dbuser
database.params.password = secret
database.params.dbname   = dbname

; Staging site configuration data inherits from production and
; overrides values as necessary
[staging : production]
;  'database.adapter' is inherited
;  others are overridden
database.params.host     = dev.example.com
database.params.username = devuser
database.params.password = devsecret

【讨论】:

    【解决方案3】:

    在您的例程早期创建一个设置常量(关键字“定义”)的页面。只需将它包含在需要的地方。

    【讨论】:

    • 您可以为生产服务器和开发服务器保留此页面的不同版本。加载新作品时,不要加载该页面。大大节省时间。
    • 感谢 EvilChookie,说得好。我可以尝试这样的事情:(A)常量,包括。依赖于服务器,来自'define's。 (B) 与会话相关的静态变量存储在一个表中(例如基于登录的用户详细信息)。但我认为他们有自己的阵列供实际使用。 (C) 需要在调用之间持久化的变量只放入一个数组中。
    • 至于到目前为止的其他 4 个答案,它们很有趣,但我不会尝试,只是因为我没有太多页面或太多变量(而且我很懒惰和全神贯注.. .并且该网站目前没有损坏)。对于上面评论中的 (A,B,C),我总共有大约十几个变量。但 Oded 可能会得到他需要的东西。
    【解决方案4】:

    就像 Smandoli 的回答一样,我使用一个包含我的配置的文件。

    但是,我的配置实际上是一个多维数组 - 这意味着我可以更好地控制我的配置 - 如果需要,我可以随时更改它,以及分解变量。

    $config['error']['nologin'] = "你没有登录"; $config['db']['host'] = "localhost"; $config['something']['else'] = "hello world";

    编辑:我使用一个文件来存储不会发生太大变化的值。我偶尔会使用数据库中的变量,但不会太频繁。

    我的经验法则是“如果用户不需要更改它,从文件加载;如果他们需要更改它,那么它来自数据库”。

    【讨论】:

      【解决方案5】:

      我来自 C++ 的世界,其范例是使用单例在第一次(也是唯一一次)实例化时加载参数并导出具有相关 get'ter 的接口(如 'int GetVal(char* key,int &val )' ) 可以从应用程序的所有部分访问单音,PHP 中有类似的东西吗?

      【讨论】:

      • 您必须记住,PHP 中的每个请求基本上就像启动一个全新的可执行文件实例,获取输出,然后让可执行文件终止。您在一个请求中设置的单例将不可用于第二个请求,除非您将其放入某种缓存中。默认的普通 PHP 安装不包括任何此类缓存机制(缺少平面文件)。您必须安装一个,例如 memcached 或 APC。
      • 我今天还没来得及研究单例,但我要补充一点,我的 VBA 背景确实要求我对HTTP。
      猜你喜欢
      • 2017-09-14
      • 2018-10-21
      • 1970-01-01
      • 2016-03-31
      • 2022-12-06
      • 2016-07-26
      • 1970-01-01
      • 2010-11-10
      • 2019-01-27
      相关资源
      最近更新 更多