php 8.0 的 jit 依赖 opcache 启用且 opcache.jit_buffer_size ≥1m,需同时设置 opcache.enable=1 和 opcache.enable_cli=1(cli 场景),jit 配置必须为四位数字如 1205,验证需结合日志与性能对比。

PHP 8.0 的 JIT 不是独立开关,它完全依赖 opcache 启用且配置正确;不设 opcache.jit_buffer_size 或设为 0,JIT 就等于没开。
opcache.enable 和 opcache.enable_cli 必须都为 1
很多线上环境只开了 opcache.enable=1,但 CLI 脚本(比如 PHPUnit、Artisan、自定义 bench.php)根本不会触发 JIT —— 因为默认 opcache.enable_cli=0。
- Web 请求走 FPM/SAPI:只需
opcache.enable=1 - CLI 测试或命令行工具:必须显式加
opcache.enable_cli=1 - 如果用
php -S内置服务器,它属于 SAPI 模式,也只认opcache.enable
opcache.jit_buffer_size 是 JIT 的“启动钥匙”
这个值决定 JIT 编译器能用多少内存缓存机器码。设成 0 或不写,opcache.jit 再怎么配都没用 —— PHP 直接跳过 JIT 初始化。
- 最小有效值是
1M,但太小会导致频繁淘汰,实际推荐从64M起步 - 生产环境可设
100M或256M,取决于应用热路径规模和内存余量 - 32 位系统或低内存容器需谨慎,超限会静默失败(无报错,JIT 不工作)
opcache.jit=1205 这类数字不是随便写的
它由四位数字组成:A B C D,分别控制 AVX 支持、寄存器分配、触发策略、优化深度。常见组合有:
-
1205:启用 AVX、函数级寄存器分配、按调用频次触发、激进脚本级优化(适合 Web 服务) -
1235:同上,但触发策略改用“执行超 N 次”,更可控(opcache.jit_hot_func=127配合) -
1255:当前社区较稳的推荐值,平衡编译开销与收益 - 别用
0或1开头的值(如0000),那等于禁用 JIT
注意:opcache.jit=tracing 是旧版写法,PHP 8.0+ 已废弃,必须用数字编码。
验证 JIT 是否真在工作
光看 phpinfo() 里 opcache.jit 显示值不够,得看运行时行为:
- 加
opcache.jit_debug=1(仅开发环境),PHP 会在 stderr 输出 JIT 编译日志,例如jit: compiled func foo (234 bytes) - 用
php -v看输出是否含with Zend OPcache v8.x.x,不含 JIT 字样说明配置未生效 - 跑一个纯计算脚本(如
Zend/bench.php),对比开/关 JIT 的耗时差异;I/O 类脚本差异可能不明显
最容易被忽略的一点:JIT 对代码结构敏感。满屏 eval()、动态函数名、__call 重载多的代码,JIT 很难生成有效机器码 —— 它不是银弹,而是给“稳定热路径”准备的加速器。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











