php 8.4 中仅 tracing 是有效 jit 模式,function 模式已弃用;启用需 opcache.jit=tracing 与 opcache.jit_buffer_size≥64m,且 opcache.enable_cli=0;禁用必须显式设 opcache.jit=disable。

tracing 模式和 function 模式在 PHP 8.4 中已不是“二选一”的关系
PHP 8.4 中 function 模式实质上已被弃用:它不处理循环、不触发类型推导、不支持内联,对绝大多数实际代码无加速效果;官方文档与 RFC 明确建议停用。你看到的 opcache.jit=function 配置,只会让 JIT 静默降级为几乎不编译任何函数的状态,opcache_get_status()['jit']['script_cache'] 基本为空。
tracing 是当前唯一值得启用的 JIT 模式
tracing 不是“可选项”,而是 PHP 8.4 JIT 的事实标准模式。它通过运行时追踪热点执行路径(比如循环体、递归调用栈),生成高度优化的机器码。关键点:
-
opcache.jit=tracing和opcache.jit=1255等价,但前者语义清晰、防输错——写成125或12555会直接静默失效,无日志提示 - 必须配合足够大的缓冲区:
opcache.jit_buffer_size=64M是最低门槛,生产环境推荐256M;Docker 容器若内存限制低于该值,JIT 自动禁用且不报错 -
opcache.enable_cli=0必须设为 0,CLI 模式下 JIT 无效(哪怕你加了-d opcache.jit=tracing)
别被“模式选择”误导:真正要判断的是“要不要开 JIT”
是否启用 tracing,取决于你的代码是否真有 CPU 密集型热点:
- 开 JIT 后 Laravel API 响应没变化?正常。Web 请求瓶颈在 MySQL、Redis、HTTP 调用,这些 I/O 操作本身不产生 JIT 热点
- 数学计算(如素数筛、图像缩放)、自定义加密、AST 解析、大量
sqrt()/sin()循环——这些才可能被 JIT 编译,opcache_get_status()['jit']['script_cache']会返回非空数组 - 如果业务中几乎没有这类逻辑,开启 JIT 反而增加启动开销和内存占用(
opcache.memory_consumption至少要设到256)
PHP 8.4 的新约束:opcache.jit=disable 才能真正关掉 JIT
旧版本靠把 opcache.jit_buffer_size 设为 0 来禁用 JIT,PHP 8.4 不再兼容这种写法。现在必须显式声明:
- 启用:
opcache.jit=tracing+opcache.jit_buffer_size=64M - 禁用:
opcache.jit=disable(此时opcache.jit_buffer_size的值会被忽略) - 漏写
opcache.jit但写了opcache.jit_buffer_size,JIT 不会自动启用——这点容易被宝塔等面板配置遗漏
script_cache 仍为空,不代表没生效。观察至少 1–2 分钟的真实流量,再查状态。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











