【问题标题】:(How) does PHP cache script and custom INI-files?(如何)PHP 缓存脚本和自定义 INI 文件?
【发布时间】:2015-11-20 03:29:52
【问题描述】:

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

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

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

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

【问题讨论】:

标签: php caching configuration configuration-files ini


【解决方案1】:

总结

加载配置指令所需的时间(与应用执行这些指令所需的时间相同)通常可以忽略 - 低于 1 毫秒大多数“尺寸合理”的配置。所以不用担心——INI、PHP 或 JSON 在性能方面都是不错的选择。即使 PHP 比 JSON 快十倍,那也相当于加载 0.001 秒而不是 0.01 秒;很少有人会注意到。

也就是说,在决定将配置数据存储在何处时,个考虑因素。

.ini vs .php 配置存储

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

缓存

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

“加载器”部分和“模块”部分都可能进行缓存;并且他们都这样做可能会导致不必要的重复或冲突,因此值得一试:

  • 文件(但在 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.layout”是“VERTICAL”还是“HORIZONTAL”,而是实际生成布局(或其他任何内容)。在这种情况下,您可以通过将生成的对象存储在某处获得巨大的好处:

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

其他选项

您可能想了解client caching 和标头,并可能探索您的托管提供的任何选项(负载平衡器、Varnish 等 HTTP 缓存等)。

【讨论】:

  • IOSS 代表什么?
  • I/O 子系统(文件系统中处理数据读写、实际缓存、重复数据删除、写入优化等的部分);但我已经编辑了答案以将其删除 - 它不是一个广泛使用的首字母缩略词。谢谢。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 2019-01-23
    • 1970-01-01
    相关资源
    最近更新 更多