OPcache在PHP 8.1中默认编译但不自动启用,需通过phpinfo()确认Loaded Configuration File路径及Opcode Caching为Enabled,并确保zend_extension=opcache.so和opcache.enable=1正确配置后重启php81-fpm。

OPcache 在 PHP 8.1 中默认已编译进核心,但**不等于自动启用**——Web 请求仍可能走未缓存路径,TTFB 高、CPU 暴涨、上线后白屏,八成是 OPcache 假开启。
怎么确认 OPcache 真正在 Web 环境生效
CLI 下 php -m | grep opcache 成功 ≠ 网页请求用了 OPcache。必须用浏览器访问一个 info.php(内容为 <?php phpinfo(); ?>),然后:
- 搜索
Loaded Configuration File:记下这个路径,你改的php.ini必须是它 - 搜索
Opcode Caching:区块必须存在,且状态为Enabled - 搜索
opcache.enable:值必须是On(不是1或空) - 在网页中执行
opcache_get_status():若报Call to undefined function opcache_get_status(),说明扩展根本没加载进 FPM/Apache 进程
Linux/宝塔环境下最常踩的 zend_extension 写法坑
PHP 8.1 要求用 zend_extension 加载,extension=opcache.so 已无效,且路径和写法错一点就静默失败:
- Linux/macOS:必须写
zend_extension=opcache.so(不能带路径,系统会自动找);若手动指定路径,需确保opcache.so文件真实存在(如/usr/lib/php/20210902/opcache.so) - 宝塔用户:点“一键启用”只加基础参数,常漏掉
zend_extension=opcache.so行,必须手动补上 - 别在
[opcache]段落外写这行——它必须出现在全局或[opcache]区块内,否则被忽略 - 改完立刻验证:
sudo systemctl restart php81-fpm(服务名以你实际版本为准),只重启 Nginx 完全无效
PHP 8.1 生产环境关键参数调优
PHP 8.1 的 OPcache 默认值(memory_consumption=64, max_accelerated_files=10000)对 Laravel/Symfony/WordPress 类项目极易触发缓存抖动,命中率掉到 50% 以下反拖慢性能:
立即学习“PHP免费学习笔记(深入)”;
-
opcache.memory_consumption=256:中型项目起步值;含大量 vendor 的建议设为512 -
opcache.max_accelerated_files=32531:质数,减少哈希冲突;用find /var/www/html -name "*.php" | wc -l估算总数后向上取最近质数 -
opcache.validate_timestamps=1:生产环境绝不能设为0——否则代码上线后页面白屏、Class not found 全由此引发 -
opcache.revalidate_freq=5:每 5 秒检查一次文件变更,平衡更新及时性与性能;容器或只读文件系统才考虑=0,且必须配合部署脚本调用opcache_reset() -
opcache.fast_shutdown=1和opcache.optimization_level=0xffffffff:PHP 8.1 默认已启用,但建议显式写出以防被覆盖
代码上线后不更新?不是缓存 HTML,是 OPcache 没“闻到”变化
典型现象:rsync 部署完新 PHP 文件,页面还是旧逻辑,甚至 fatal error。这不是浏览器缓存问题,而是 OPcache 仍在运行旧字节码:
- 如果
opcache.validate_timestamps=1,等revalidate_freq秒后自动更新——但别依赖它,发布后应主动调用opcache_reset() - CLI 执行:
php -r 'opcache_reset();'(确保该 CLI 使用的是和 Web 相同的 PHP 配置) - 某些 PaaS(如阿里云函数计算)禁用
opcache_reset(),此时只能kill -USR2重启 PHP-FPM 进程,或用opcache_invalidate('path/to/file.php', true)单文件刷新 - 别信“重启 Nginx 就行”——PHP-FPM 进程不重启,OPcache 缓存就不会清
真正难的不是配参数,是每次改完都去验证 opcache_get_status()['opcache_statistics']['hits'] 是否在增长;一旦发现 hits 停滞,说明缓存没进 Web 流程,得回头再查 Loaded Configuration File 和 zend_extension 行是否真生效。



















