phpenv下opcache.enable_cli不生效主因是未在phpenv管理的PHP版本对应配置文件(如~/.phpenv/versions/x.x.x/etc/php.ini或conf.d/opcache.ini)中正确设置且重启CLI进程;需确认zend_extension路径正确、opcache.enable_cli=1显式启用,并用php -r "var_dump(opcache_get_status()'opcache_statistics');"验证。

phpenv 下 opcache.enable_cli 为什么设了也不生效
因为 phpenv 管理的是 CLI 模式的 PHP,而 opcache.enable_cli 默认是 0,且它只在 CLI 的 php.ini 中起作用——但 phpenv 默认不会自动加载或生成带 opcache 配置的 ini 文件。你改了系统级 /etc/php/*/cli/php.ini,对 phpenv 切换的版本完全无效。
实操建议:
- 先确认当前 phpenv 使用的 PHP 版本和配置路径:
phpenv version+php --ini,重点看「Loaded Configuration File」那一行 - 如果显示的是类似
~/.phpenv/versions/8.2.12/etc/php.ini的路径,就直接编辑这个文件;如果显示「none」,说明没加载任何 ini,得手动创建或启用 - 确保
zend_extension行已启用(不是注释状态),且路径指向正确的opcache.so(Linux/macOS)或php_opcache.dll(Windows)
怎么给 phpenv 管理的 PHP 版本加 opcache.ini
phpenv 不会自动为你建 opcache 配置文件,必须手动补全。推荐做法是独立建一个 opcache.ini 放进该版本的 etc/conf.d/ 目录(若不存在则新建),而不是硬塞进主 php.ini。
示例步骤(以 phpenv 当前版本 8.2.12 为例):
立即学习“PHP免费学习笔记(深入)”;
- 执行
mkdir -p ~/.phpenv/versions/8.2.12/etc/conf.d - 创建
~/.phpenv/versions/8.2.12/etc/conf.d/opcache.ini,内容如下:
opcache.enable=1 opcache.enable_cli=1 opcache.memory_consumption=128 opcache.max_accelerated_files=10000 opcache.validate_timestamps=0 opcache.revalidate_freq=0
注意:这里 opcache.validate_timestamps=0 在 CLI 场景下是安全的——命令行脚本生命周期短、不热更,关掉时间戳校验能避免每次 php artisan 或 composer install 都触发重编译。
验证 opcache.enable_cli 是否真生效
别只信 php -v 末尾有没有 OPcache 字样,那是扩展是否加载;要确认 CLI 模式下缓存是否实际工作,得看运行时状态。
执行以下命令检查:
-
php -r "var_dump(opcache_get_status()['opcache_statistics']['opcache_enabled']);"→ 应输出bool(true) -
php -r "var_dump(opcache_get_status()['opcache_statistics']['num_cached_scripts']);"→ 第二次运行该命令时值应 > 0(首次为 0 是正常的) - 如果报错
Call to undefined function opcache_get_status(),说明zend_extension路径不对或扩展根本没加载成功
常见错误现象:opcache_get_status() 返回 null 或抛出警告,大概率是 opcache.enable_cli=1 写在了 FPM 专用的 ini 里,CLI 根本读不到。
为什么 Laravel/Composer 命令开 opcache_cli 反而变慢
不是所有 CLI 场景都适合开 opcache.enable_cli=1。Composer 加载器本身做了大量反射和动态类查找,OPcache 对这类短命、高动态的脚本优化有限;Laravel 的 artisan optimize(旧版)或 route:cache 等命令,反而可能因缓存未命中导致额外开销。
判断依据:
- 用
time php artisan list测两次,对比开启/关闭opcache.enable_cli后的耗时差异 - 观察
opcache_get_status()['opcache_statistics']['hits'] / (hits + misses)是否长期低于0.7——低于这个值,说明缓存基本没被复用 - 开发调试阶段建议设为
1(配合opcache.validate_timestamps=1和低revalidate_freq),上线部署脚本才切回0
最易被忽略的一点:phpenv 切换版本后,etc/conf.d/ 下的配置不会自动复制到新版本目录,每次 phpenv install 新版本都得手动补一遍 opcache.ini。



















