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

Edw*_*ard 8 php configuration ini caching configuration-files

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

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

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

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

LSe*_*rni 5

摘要

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

也就是说,在决定存储配置数据的位置时需要考虑因素.

.ini vs .php配置存储

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

高速缓存

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

"加载器"部分和"模块"部分都可以进行缓存; 他们这样做可能导致不必要的重复或冲突,所以值得检查一下:

  • 该文件(但在INI,JSON和PHP文件之间没有变化)将被缓存到文件系统I/O子系统层中,除非内存真的很重要,否则将从那里加载(在相关说明中,这是不是所有文件系统都适用于所有网站的原因之一).
  • 如果您需要在多个文件中进行配置,并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.

其他选项

您可能希望阅读有关客户端缓存和标头的信息,并可能会探索您的主机提供的任何选项(负载平衡器,HTTP缓存,如Varnish等).