PHP 8.1 的 JIT 不提升 Web 请求 QPS,因其仅加速 CPU 密集型代码;I/O 瓶颈(如数据库、Redis)场景无效,且需 OPcache 启用、jit_buffer_size≥128M、opcache.jit=tracing 三者齐备才生效。

PHP 8.1 的 JIT 并不会自动提升 Web 请求的 QPS,它只对 CPU 密集型代码有效。压测发现 QPS 几乎没变化,大概率不是配置错了,而是场景不匹配——绝大多数 HTTP 请求的瓶颈在数据库、Redis、网络 I/O 或模板渲染,JIT 根本不介入这些环节。
必须同时满足的三个硬性前提
缺一不可,否则 JIT 完全不工作:
- OPcache 已启用:Web 场景设 opcache.enable=1;CLI 压测脚本需额外加 opcache.enable_cli=1
- JIT 缓冲区已分配:opcache.jit_buffer_size=128M(默认为 0,等于关闭);FPM 下每个 worker 独占该内存,10 个 worker 就占 1.28GB,别盲目设 1G
- JIT 模式明确开启:推荐用语义写法 opcache.jit=tracing(等价于数字 1255),避免写错数字如 125 导致静默失效
针对压测场景选对 jit 配置值
PHP 8.1 中,opcache.jit=tracing 是最稳妥的选择,它对应四位数 1255,含义如下:
- C=1:启用 CPU 特定优化(如 AVX 指令),现代 x86-64 服务器建议保留
- R=2:使用全局寄存器分配,比 R=1 更激进但收益明显,适合稳定计算逻辑
- T=5:启用 tracing 模式,能识别循环和函数调用热点,比 function 模式(T=1)更实用
- O=5:最高优化等级,含类型推导、函数内联、死代码消除等
若压测脚本含大量动态调用(如 call_user_func、__call),可降级为 opcache.jit=1205(禁用函数内联,更保守)。
立即学习“PHP免费学习笔记(深入)”;
如何确认 JIT 真正生效
别只看配置文件,要实测验证:
- 运行 php -i | grep jit,输出中应含 opcache.jit => tracing 且无警告
- 在压测脚本开头加入:
<?php
$status = opcache_get_status(false);
var_dump($status['jit'] ?? 'JIT 未编译任何代码');
?>
若输出中 enabled 和 on 均为 true,且 script_cache 有函数名列表,说明 JIT 已命中并编译 - 观察 memory_consumption 字段值,按其 1.5 倍调整 opcache.jit_buffer_size,避免缓冲区满导致静默回退
压测时更容易见效的实践建议
- 用 CLI 模式压测计算密集型脚本(如批量数学运算、图像像素处理),比 FPM 请求更易触发 JIT:单次长生命周期利于热点积累与复用
- 确保被测代码有足够执行频次:JIT 默认需某段代码执行满 100 次才标记为热点;低流量接口或每次只跑一次的命令几乎无法触发
- 避免拿 Laravel API 或 WordPress 页面直接压测——它们本质是 I/O 型,QPS 不变是正常现象;真正受益的是后台数据清洗、加密解密、AST 解析等任务



















