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

(How) does PHP cache script and custom INI-files?

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

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

读取它

在我看来 PHP 将脚本文件保存在内存中,因此包含脚本文件(通常)不会导致 IO(或者 Zend 是否进行缓存?或者根本不缓存源代码? ).

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

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

总结

加载配置指令所需的时间(与应用程序执行这些指令所需的时间不同)通常可以忽略不计 - 大多数 "reasonably sized" 配置低于一毫秒。所以不用担心 - INI、PHP 或 JSON 都是性能明智的,都是同样好的选择。即使 PHP 比 JSON 快 10 倍,那也相当于在 0.001 秒而不是 0.01 秒内加载;很少有人会注意到。

也就是说,在决定在哪里存储配置数据时有 考虑因素。

.ini 与 .php 配置存储

  • 加载时间:大部分相同,除非涉及缓存(见下文),正如我所说,并不重要。
  • 易用性:.ini 更易于人类阅读和修改。这可能是优势,也可能是劣势(如果是后者,想想完整性检查)。
  • 数据格式:PHP 可以存储比 .ini 文件更多的结构化数据,除非使用非常复杂的解决方法。 但考虑使用 JSON 代替 INI 的可能性。
    • 更多结构化数据意味着您可以更轻松地创建 "super configuration" PHP 或 JSON 包含多个 INI 文件的等价物,同时保持信息良好隔离。
  • 自动冗余控制:PHP 文件包含可以通过 require_once 简化。
  • 用户修改:可视化 INI 和 JSON 编辑器允许用户修改 INI 或 JSON 文件,同时至少在语法上保持有效。 PHP 不是这样(你需要自己动手)。

缓存

PHP核心不做缓存。时期。也就是说,您永远不会单独使用 PHP 核心 :它将作为(快速)CGI、Apache 模块等加载。此外,您可能不会使用 "barebones" 安装,但您可以(很可能您 安装)多个模块。

"loader" 部分和 "module" 部分都可能进行缓存;他们都这样做可能会导致不必要的重复或冲突,因此值得一试:

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

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

通常情况下,根据某些配置指令,您将不得不执行几个重要操作之一。然后您将使用结果进行实际输出。

在这种情况下减慢工作流程的不是读取 "config.layout" 是 "VERTICAL" 还是 "HORIZONTAL",而是 实际上生成 布局(或其他)。在这种情况下,您可以通过将生成的 object 存储在某个地方来获得巨大的好处:

  • 在文件中序列化(例如 cache/config.layout.vertical.html.gz)。如果布局发生变化,您可能需要部署某种 'stale data check' 或某种缓存失效程序。 (对于具体的布局,您可以查看 Twig,它也进行参数化模板缓存)。
  • 在密钥库中,例如 Redis
  • 在诸如 MySQL 之类的 RDBMS 数据库中(即使这有点矫枉过正 - 您基本上可以将其用作密钥库)。
  • 更快的 NoSQL 替代方案,例如 MongoDB。

其他选项

您可能想阅读有关 client caching 和 headers 的内容,并可能探索您的主机提供的任何选项(负载平衡器、HTTP 缓存,例如 Varnish 等)。