php 7.2.31 的 opcache 是内建于 zend 引擎的编译层字节码缓存,缓存 opcode 和 interned string 到共享内存,跳过重复解析与编译;不缓存运行时数据、eval() 代码及注释。

PHP 7.2.31 中的 OPcache 是一个内建于 Zend 引擎的字节码缓存扩展,其核心机制是将 PHP 脚本编译后的 opcode(操作码)和 interned string(内部字符串)持久化到共享内存中,使后续请求跳过词法分析、语法解析与编译阶段,直接执行缓存的指令序列。
它不是简单的文件缓存,也不是运行时变量缓存,而是作用于 PHP 生命周期最前端的编译层优化。
OPcache 缓存的两类关键内容
Opcode 缓存
每个 PHP 文件被 Zend 引擎解析后,会生成一份中间表示——opcode 数组(如ZEND_ECHO、ZEND_ADD等指令)。OPcache 把这些 opcode 序列序列化并存入共享内存(由opcache.memory_consumption控制大小),供所有 worker 进程复用。
✅ 效果:避免重复解析.php文件、重复构建 AST、重复生成 opcode。Interned String 缓存
PHP 在编译期会把常量字符串(如变量名、函数名、类名、'id'、'status'等字面量)统一归入一个全局字符串表(interned string table),相同内容只存一份,其他地方用指针引用。
⚠️ 这块内存独立于 opcode 共享内存,由opcache.interned_strings_buffer单独控制(单位 MB)。若该区域不足,会触发INTERNED STRING BUFFER OVERFLOW警告,导致部分字符串无法去重,增加内存开销和 CPU 复制成本。
PHP 7.2.31 的关键行为特征
-
opcache.fast_shutdown仍有效(该参数在 PHP 7.2.0 后未被移除,直到 7.3+ 才彻底废弃);它通过快速释放用户空间变量来加速脚本结束,配合 OPcache 可略微提升吞吐。 -
opcache.max_accelerated_files实际生效值是「大于等于设定值的最小质数」,例如设为4000,真实哈希表容量为4001(质数),用于减少哈希冲突。 -
opcache.revalidate_freq=60表示默认每 60 秒检查一次脚本修改时间(mtime),若文件变更则重新编译加载;设为0则完全不校验(适合生产静态环境)。 - CLI 模式下需显式开启
opcache.enable_cli=1才能启用(默认为0),这对 PHPUnit 或部署脚本的性能有明显影响。
不缓存什么
- 不缓存运行时数据(如
$_SESSION、$GLOBALS、对象实例) - 不缓存
eval()动态代码(除非启用opcache.enable_file_override=1,但该选项在 7.2.31 中存在兼容风险,不建议开启) - 不缓存注释内容(
opcache.save_comments=0可进一步节省内存,但会破坏依赖@Annotation的框架如早期 Doctrine)
本质上,PHP 7.2.31 的 OPcache 是一个轻量、高效、无侵入的编译层加速器,它的性能收益高度依赖项目结构:文件越多、框架越重(如 Laravel 加载 150+ 文件/请求),OPcache 的价值就越显著。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











