PHP 8 的 JIT 编译仅对反复执行的 CPU 密集型代码有效,需同时满足 OPcache 启用、jit_buffer_size≥64M、jit 模式正确(如 tracing)三条件,缺一即静默失效。

PHP 8 的 JIT 编译不是一键加速的“全局开关”,它只对运行中反复执行的 CPU 密集型代码起作用,且必须满足三要素:OPcache 启用、缓冲区足够、模式正确配置。开启后不会立竿见影,需通过真实负载触发热点识别,再用可比代码验证效果。
开启 JIT 的三个硬性条件
缺一不可,任意一项不达标都会导致 JIT 静默失效(无报错、无提示):
-
OPcache 必须启用:Web 场景设
opcache.enable=1;CLI 脚本测试需额外开启opcache.enable_cli=1 -
缓冲区必须显式设置且 ≥64M:如
opcache.jit_buffer_size=128M;设为 0 或未配置,JIT 直接跳过 -
模式必须明确且有效:推荐
opcache.jit=tracing(等价于 1255),语义清晰、支持全量优化;避免使用已弃用的function模式,数字写错(如 125)也会静默失败
确认 JIT 是否真正生效
改完配置不等于开成功,要分两步验证:
- 终端执行
php -i | grep jit,看到opcache.jit => tracing且无警告信息 - 在 PHP 脚本中调用:
<?php var_dump(opcache_get_status()['jit']); ?>
检查返回数组中enabled和on均为true,script_cache里有函数名才说明 JIT 正在编译并缓存代码
设计有效的性能测试
避开 I/O 干扰,聚焦纯计算路径,才能体现 JIT 价值:
立即学习“PHP免费学习笔记(深入)”;
- 选典型 CPU 密集型任务:比如百万次
sin()、sqrt()运算,或递归斐波那契(fibonacci(35))、整数累加循环 - 单次运行不足以触发 JIT:热点默认需执行 100 次以上,建议脚本内循环多次,或连续运行同一脚本 3–5 轮观察趋势
- 对比方式要一致:分别在 JIT 开启和关闭状态下(如临时设
opcache.jit=0)运行相同代码,记录microtime(true)差值 - 注意 CLI 更敏感:FPM 请求生命周期短,热点难积累;优先用
php calc.php类脚本测试
常见无效场景与误判提醒
很多“开了没变快”其实是预期偏差:
- Laravel/WordPress 响应时间不变?正常——它们瓶颈在数据库查询、Redis 读写、模板渲染等 I/O 环节,JIT 不参与
- 首次运行变慢?合理——JIT 编译本身有开销,冷启动阶段可能略拖慢,后续复用才提速
- 内存占用明显上升?检查
opcache.jit_buffer_size设置:FPM 下每个 worker 独占该内存,10 个 worker 设 256M 就吃掉 2.5GB 物理内存 - 想看实时编译情况?启用
opcache.log_verbosity_level=2,日志中出现JIT buffer full表示缓冲区不够,需调大



















