(如何)PHP缓存脚本和自定义INI文件?

时间:2015-08-26 07:44:09

标签: php caching configuration configuration-files ini

目前我正在将PHP脚本的配置存储在另一个PHP脚本中的变量和常量中(例如config.php)。

因此,每次调用脚本时,它都包含配置脚本以访问变量/常量的值。 由于INI文件更容易被其他脚本解析,我考虑将配置的值存储在这样的文件中,并使用parse_ini_file()读取它。

在我的观点中,PHP将脚本文件保存在内存中,因此包含脚本文件(通常)不会导致IO(或者Zend是否进行缓存?或者根本没有缓存源?)。

如何阅读自定义INI文件。我知道.user.ini有缓存(请参阅user_ini.cache_ttl),但PHP是否也会缓存自定义INI文件?或者调用parse_ini_file()是否会导致IO?

2 个答案:

答案 0 :(得分:5)

摘要

加载配置指令所需的时间(与应用程序执行这些指令所需的时间相同)通常可忽略不计 - 低于1毫秒最“合理大小”的配置。所以不要担心 - 在性能方面,INI,PHP或JSON都是同样好的选择。即使PHP比JSON快十倍,也就像加载0.001s而不是0.01s;很少有人会注意到。

也就是说,在决定存储配置数据的位置时,注意事项。

.ini vs .php config storage

  • 加载时间:大致相同,除非涉及缓存(见下文),正如我所说,并不重要。
  • 易用性:.ini更易于阅读和修改。这可能是一个优点,也可能是一个缺点(如果是后者,请考虑完整性检查)。
  • 数据格式:除非使用非常复杂的变通方法,否则PHP可以存储比.ini文件更多的结构化数据。 但请考虑使用JSON代替INI 的可能性。
    • 更多结构化数据意味着您可以更轻松地创建“超级配置”PHP或JSON,其中包含相当于几个INI​​文件,同时保持信息隔离。
  • 自动冗余控制:可以使用require_once简化PHP文件包含。
  • 用户修改:有可视的INI和JSON编辑器,可以允许用户修改INI或JSON文件,同时保持它至少在语法上有效。 PHP不是这样(你需要自己动手)。

缓存

PHP核心不进行缓存。期即可。也就是说,你永远不会单独使用PHP核心 :它将被加载为(快速)CGI,Apache模块等等。此外,您可能不会使用“准系统”安装,但您可能已经安装了几个模块(很可能是 )。

“loader”部分和“module”部分都可以进行缓存;他们这样做可能会导致不必要的重复或冲突,所以值得检查一下:

  • 该文件(但在INI,JSON和PHP文件之间没有变化)将被缓存到文件系统I / O子系统层中,除非内存真的很重要,否则将从那里加载(在相关说明中) ,这是not all filesystems are equally good for all websites)。
  • 的原因之一
  • 如果您需要在多个文件中进行配置,并在所有文件中都使用require_once,则配置只会在需要时加载一次。这不是缓存,但它仍然是性能提升。
  • 存在几个模块(Zend,opcache,APC,...),它们将缓存所有 PHP文件,包括配置。但是,它们不会缓存INI文件。
  • 模块(例如opcache)完成的缓存可以(a)忽略对文件系统的进一步修改,这意味着在修改PHP文件时,您需要以某种方式重新加载或使缓存无效;如何在模块之间进行此更改; (b)实现可能与文件系统数据管理或其文件结构冲突的快捷方式(着名的是,opcache可以忽略文件的路径部分,允许更快的性能除非你有两个文件当它冒着加载一个而不是另一个的风险时,在不同的目录中使用相同的名称

性能增强:缓存消化的数据而不是config指令

通常情况下,根据某些配置指令,您必须执行几个非常简单的操作之一。然后,您将使用结果作为实际输出。

在这种情况下减慢工作流程的速度不是读取“config.layout”是“VERTICAL”还是“HORIZONTAL”,而是实际生成布局(或其他任何内容)。在这种情况下,您可以通过将生成的对象存储在某处来获得巨大的好处:

  • 在文件中序列化(例如cache/config.layout.vertical.html.gz)。如果布局发生更改,或者某种缓存失效过程,您可能需要部署某种“陈旧数据检查”。 (具体来说,对于布局,您可以查看Twig,它也可以进行参数化模板缓存。)
  • 在密钥库中,例如Redis
  • 在像MySQL这样的RDBMS数据库中(即使这有点过分 - 基本上你将它用作密钥库)。
  • 更快的NoSQL替代品,例如MongoDB。

其他选项

您可能希望阅读有关client caching和标题的信息,并可能会探索您的托管提供的任何选项(负载均衡器,HTTP缓存,如Varnish等)。

答案 1 :(得分:0)

parse_ini_file()使用标准操作将文件转换为数组。