从 PHP5.5 开始,Opcache 扩展是核心的一部分,增加了对 PHP 脚本的字节码缓存的支持。对于动态语言(例如 PHP ),字节码缓存可以显著的提高性能,因为它可以确保脚本仅被编译一次。
Opcache 扩展的默认设置已经在很大程度上提高了 PHP 的性能,但是您可以通过修改默认配置以获取更佳的性能。
警告:这篇文章反复提到的监视统计信息 opcache_get_status(false)
。因为 Opcache 为每个 SAPI 使用唯一的共享内存池,所以您无法从控制台访问 Web 服务器统计信息。该调用必须通过 Apache 或 PHP-FPM 进行。
当内存太小时,应避免一些不正确的缓存方式
Opcache 默认使用 64 MB 内存来保存编译后的 PHP 脚本以及最多 3907 个 PHP 脚本。 虽然这足以缓存您的 PHP 脚本,但有一些需要注意的:
- 如果您的应用会生成 (PHP) 代码或者使用基于 PHP 文件的缓存 (例如: Symfony, Doctrine Annotations, FLOW3), 那么可能会有大量 PHP 文件不会被 Opcache 缓存
- 如果您开启了
validate_timestamps
时间戳验证并在生产环境中修改了代码,那么旧的缓存条目将被标记为过期,这种过期的缓存条目会增加 Opcache 的内存消耗 - 如果您使用每个版本部署到新目录的部署策略,则 Opcache 会将不同目录下的同一个 PHP 文件进行多次缓存,这样也会快速的占用 Opcache 的内存使用
当 Opcache 在某些情况下内存满时,它将擦除所有缓存条目并从空缓存开始。 如果发生这种情况,并且您的服务器流量很大,这可能会导致 thundering herd problem 或缓存猛击:许多请求同时生成相同的缓存条目。
你要避免 Opcache 用空的缓存重新启动。
检测 opcache 是否 “已满” 的算法取决于三个不同 INI 设置之间的直观交互,目前尚无记录。 它有助于深入理解 C 代码来理解它。
三个相关的 ini 变量定义如下:
-opcache.memor