opcache需验证是否加载且生效:执行php -m | grep opcache、查看phpinfo()中“opcode caching”是否enabled、调用opcache_get_status()返回非空数组;必须正确配置zend_extension、opcache.enable=1等参数并重启php服务。

确认 OPcache 是否已加载且生效
很多 PHP 环境(尤其是本地一键包或 Docker 镜像)虽然编译支持 OPcache,但默认没启用,或者只在 CLI 下关闭了。别只看 php -v 里有没有 with Zend OPcache ——那只是编译支持,不等于运行时启用。
真正有效的验证方式有三个:
- 执行
php -m | grep opcache,有输出说明扩展已加载 - 访问
phpinfo()页面,搜索OPcache,确认 “Opcode Caching” 显示Enabled - 写一行脚本:
<?php var_dump(opcache_get_status()); ?>,返回非空数组才算真正在工作
特别注意:如果返回 false 或空数组,大概率是 opcache.enable=1 没写对位置,或者改的是 CLI 的 php.ini 而不是 Web SAPI(如 PHP-FPM)用的那个。
必须修改的 php.ini 配置项
OPcache 不是“开个开关”就完事,opcache.enable=1 是起点,但默认参数在生产环境基本不可用。关键几项必须手动设:
-
zend_extension=opcache.so(Linux/macOS)或zend_extension=php_opcache.dll(Windows)——必须用zend_extension,不是extension;路径要写对,常见错误是漏掉分号取消注释或路径错误 -
opcache.enable=1—— Web 环境必须为1;CLI 下建议保持0,否则php -l或单元测试可能误用缓存 -
opcache.memory_consumption=128—— 单位 MB,小站 128 够用,中大型项目建议 256 或 512;低于 64 容易因内存满导致频繁淘汰 -
opcache.max_accelerated_files=20000—— Composer 项目轻松超 10000,用find /path/to/app -name "*.php" | wc -l算出实际数,再乘 1.5 填进去 -
opcache.validate_timestamps=1—— 生产环境绝不能设为0,否则代码更新后页面不刷新、类找不到全是它惹的祸 -
opcache.revalidate_freq=60—— 和上一条配合使用,表示每 60 秒检查一次文件是否改动;开发环境可设为0实时生效
改完配置后服务没重启 = 白配
这是最常被跳过的一步:修改 php.ini 后,仅重载 Nginx/Apache 配置完全无效。OPcache 是 PHP 进程级缓存,必须让 PHP-FPM(或 Apache 的 mod_php)进程重新加载配置。
操作取决于你的部署方式:
- PHP-FPM:执行
sudo systemctl restart php-fpm或sudo service php8.2-fpm restart(版本号按实际替换) - Apache + mod_php:需
sudo systemctl restart apache2 - 宝塔/AMH 等面板:在 PHP 设置页点【重载配置】或【重启服务】,别只点【保存】
- Docker:不能只
docker exec改文件,得重建容器或触发 reload(如docker kill -s SIGUSR2for PHP-FPM)
验证是否生效?再跑一遍 opcache_get_status(),看 opcache_statistics['opcache_enabled'] 是不是 true,且 memory_usage['used_memory'] 开始上涨。
上线后页面还是旧逻辑?别急着删缓存
典型现象:代码已部署,curl 请求返回旧内容,甚至报 Fatal error: Class 'XXX' not found。这不是浏览器缓存,也不是 CDN,是 OPcache 还在执行旧字节码。
根本原因只有两个:
-
opcache.validate_timestamps=0且没配opcache_reset()—— 时间戳校验关了,OPcache 就彻底“失明” - 部署用了 rsync --delete 或挂载只读卷,导致文件 mtime 没变或异常,
validate_timestamps=1也失效
临时救急可用 opcache_reset()(需写个简单脚本并确保权限允许),但更稳妥的做法是:保持 validate_timestamps=1 + revalidate_freq=60,发布后等最多 60 秒自动刷新;若需秒级生效,配合部署脚本调用 opcache_invalidate($file, true) 刷新单文件,比全量重置更轻量。
复杂点在于:不同 PHP-FPM worker 进程各自维护一份 OPcache,不存在跨进程同步;命中率统计也是 per-process 的。所以监控要看平均值,而不是单个 worker 的状态。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











