JIT生效需同时满足opcache.enable=1(Web)和opcache.enable_cli=1(CLI),且opcache.jit_buffer_size必须显式设为>0的值(如100M),opcache.jit推荐设为1255;仅phpinfo显示“JIT enabled”不等于实际启用,须通过opcache_get_status()['jit']中enabled和on均为true验证。

opcache.enable 必须为 1,否则 JIT 完全不生效
JIT 不是独立模块,它依附于 OPcache 运行。即使你写了 opcache.jit=1255,只要 opcache.enable=0 或该配置项被注释掉,JIT 就不会加载——连日志都不会报错,只会静默失效。
phpEnv 默认可能关闭 OPcache(尤其 CLI 模式),务必检查两处:
-
php.ini中的opcache.enable=1(用于 Web SAPI,如 Apache/Nginx + PHP-FPM) -
php.ini中的opcache.enable_cli=1(用于 CLI 模式,比如跑测试脚本或 Artisan 命令)
常见坑:只开了 opcache.enable 却没开 opcache.enable_cli,导致用 php -r "var_dump(opcache_get_status()['jit']);" 测试时返回 null 或报错“OPcache is disabled”。
opcache.jit_buffer_size 必须显式设置且 > 0
JIT 缓冲区大小决定能编译多少热点代码。默认值是 0,即禁用 JIT,哪怕 opcache.jit 设成 1255 也无效。
立即学习“PHP免费学习笔记(深入)”;
建议直接设为 100M(即 opcache.jit_buffer_size=100M),理由如下:
-
50M在复杂框架(如 Laravel)下容易 buffer overflow,触发 JIT 回退到解释执行 -
100M是官方文档和多数生产环境验证过的安全起点 - 该值不能用 KB/GB 单位缩写(如
100MB或0.1G),必须写成100M(字母 M 大写)
若 phpEnv 启用了多版本共存,注意确认修改的是当前 PHP 8.0 实际加载的 php.ini 路径(可用 php --ini 查看)。
opcache.jit=1255 是最稳妥的启用值
opcache.jit 是四位数字组合,顺序为「CPU 标志|寄存器分配|JIT 触发器|优化级别」。虽然 1235、tracing 等写法也能工作,但 1255 是目前兼容性最好、实测最稳定的配置:
- 第一位
1:启用 AVX 指令(现代 x86-64 CPU 普遍支持,不启用反而可能降级) - 第二位
2:全局线性扫描寄存器分配,比1(本地)更激进,适合长生命周期请求 - 第三位
5:跟踪模式(tracing),对循环、重复调用路径敏感,适合 Web 请求场景 - 第四位
5:最高优化级别,启用过程间分析,对函数调用链收益最大
不要用 opcache.jit=on 或 opcache.jit=1 ——这些是非标准写法,PHP 8.0+ 会忽略或报警告。
CLI 下测试 JIT 是否真启用,别只看 phpinfo()
phpinfo() 页面里显示 “JIT enabled” 只说明扩展加载了,不代表当前上下文已激活。真正验证要靠运行时状态:
在 CLI 下执行:
php -dopcache.enable_cli=1 -dopcache.jit=1255 -dopcache.jit_buffer_size=100M -r "var_dump(opcache_get_status()['jit']);"
正常输出中必须同时满足:
"enabled" => true"on" => true-
"buffer_size" > 0(比如104857600对应 100M)
如果 "on" 是 false,大概率是 opcache.enable_cli 没生效,或者脚本执行前 OPcache 已被重置(如某些 phpEnv 的热重载机制会干扰)。
JIT 的实际效果高度依赖代码特征:纯计算密集型逻辑(如数值迭代、图像像素处理)提升明显;而大部分 Web 应用卡在 MySQL 查询、Redis 网络延迟、文件 I/O 上,JIT 带来的收益会被掩盖。别在简单 echo "hello" 脚本里测性能,那测的只是启动开销。



















