OPcache在phpEnv中默认不生效,必须确认Web实际加载的php.ini路径(通过phpinfo()查看Loaded Configuration File),写入zend_extension=opcache.so、opcache.enable=1、opcache.validate_timestamps=1三行核心配置,重启对应PHP-FPM进程(非Nginx/Apache),并用phpinfo()和opcache_get_status()双重验证。

phpEnv 里 OPcache 默认不生效,不是点个开关就行,而是必须手动改对配置、重启对进程、再用网页验证——改 CLI 的 php.ini 或只重启 nginx 都没用。
怎么确认 phpEnv 当前用的是哪个 php.ini
phpEnv 是多版本共存环境,每个 PHP 版本有独立配置文件,不能凭感觉乱改。你改的 ini 文件必须是 Web 请求实际加载的那个。
- 在网站根目录放一个
info.php,内容为<?php phpinfo(); ?> - 用浏览器访问它,搜索
Loaded Configuration File,记下完整路径(比如/phpenv/versions/8.2.12/etc/php.ini) - 别信
php --ini或php -i | grep 'Loaded'的输出——它显示的是 CLI 路径,和网页请求无关
必须写对的三行核心配置(缺一不可)
打开上一步确认的 php.ini,找到或新增 [opcache] 区块,确保这三行存在且未被注释:
-
zend_extension=opcache.so(Linux/macOS;Windows 是php_opcache.dll,路径要对) -
opcache.enable=1(必须显式写,不能靠默认值) -
opcache.validate_timestamps=1(生产环境不加这一条,代码更新后必白屏或 Class not found)
其他参数如 memory_consumption 或 max_accelerated_files 可后续调优,但这三行是 OPcache 能跑起来的底线。
立即学习“PHP免费学习笔记(深入)”;
重启什么服务才真正生效
phpEnv 下 PHP 通常以 FPM 方式运行,Nginx/Apache 只是反向代理。只重启 web 服务器完全无效。
- 执行
phpenv fpm-stop 8.2.12(把版本号换成你实际用的,如8.4.5) - 再执行
phpenv fpm-start 8.2.12 - 如果用的是自定义 service 名(比如
php82-fpm),就用sudo systemctl restart php82-fpm - 验证:刷新
info.php页面,搜索Opcode Caching,状态必须是Enabled;再搜opcache_get_status,不报错才算加载成功
为什么 opcache_get_status() 报错或命中率长期低于 60%
常见原因不是配置漏了,而是缓存空间或容量不够,导致刚缓存完就被踢掉,反复编译。
-
opcache.memory_consumption设太小(如默认 64)→ 大项目直接爆内存,降级成“假启用” -
opcache.max_accelerated_files小于实际 PHP 文件数(Composer vendor + 框架 + 自定义文件常超 15000)→ 哈希冲突高,缓存淘汰频繁 -
opcache.revalidate_freq=0且validate_timestamps=1→ 每次请求都 stat 所有文件,CPU 反而更高 - 改完参数不重启 FPM,只 reload nginx → 配置根本没进 PHP 进程
真正上线前,至少设 memory_consumption=256 和 max_accelerated_files=20000,再看 opcache_get_status()['opcache_statistics']['hits_per_second'] 是否稳定上升。



















