PHP 8.1 JIT 不自动提升 QPS,必须同时满足 OPcache 启用、jit_buffer_size≥64M、jit=tracing 三前提,且需 64 位环境、CPU 支持 cx16 指令集,再通过 opcache_get_status() 验证 enabled/on 为 true 才算真正生效。

PHP 8.1 的 JIT 不是设了配置就自动生效的开关,它有一套严格的启动链路。配置写了但压测 QPS 没变化、php -i 显示 jit 值却无加速效果,大概率是某个环节静默失败。排查必须按执行顺序逐层验证,不能只看 ini 文件。
确认三个硬性前提是否全部满足
JIT 启动依赖三个条件同时成立,缺一不可,且顺序敏感:
-
OPcache 必须启用:Web 场景需
opcache.enable=1;CLI 压测脚本还必须额外加opcache.enable_cli=1(FPM 和 CLI 的 php.ini 是两份,常被忽略) -
JIT 缓冲区必须显式分配:
opcache.jit_buffer_size不能为 0 或未设置,默认值就是 0 → 等于关闭 JIT;建议从64M起配,生产环境常见设为128M或256M -
JIT 模式必须合法且明确:推荐用语义写法
opcache.jit=tracing(等价于1255);写成125、function或留空都会导致静默失效
检查运行时环境是否支持
即使配置全对,底层环境不达标 JIT 也无法初始化:
- 执行
php -r "echo PHP_INT_SIZE;",输出必须是 8(即 64 位 PHP),32 位下 JIT 完全不可用 - 运行
cat /proc/cpuinfo | grep flags,确认含cx16(x86-64 必需)、popcnt(推荐)等指令集 - 若用宝塔面板,注意其默认 PHP 包多数插件未适配 JIT,强行开启易致白屏或 Segfault
验证 JIT 是否真在工作
别信配置,要看运行时状态:
立即学习“PHP免费学习笔记(深入)”;
- 执行
php -i | grep jit,应看到opcache.jit => tracing且无警告;若显示disabled或为空,说明未加载 - 写一个最小脚本:
<?php
$status = opcache_get_status(false);
var_dump($status['jit'] ?? 'JIT 未编译任何代码');
?>
输出中enabled和on都为 true,且script_cache里有函数名,才算真正命中 - 观察
memory_consumption字段,按其实际占用值的 1.5 倍调整opcache.jit_buffer_size,避免缓冲区满后自动降级
排除扩展与调试工具干扰
某些扩展会直接阻止 JIT 初始化:
-
Xdebug 必须禁用:它覆盖
zend_execute_ex,PHP 会主动报错“JIT is incompatible...”并禁用 JIT;调试时设opcache.jit=0,上线再改回 -
Swoole 需 ≥5.0.3,且关闭协程
swoole.enable_coroutine=Off - Redis 扩展需 ≥5.3.7;老版本可能触发段错误
- 临时测试可运行:
php -d extension= -d zend_extension= -d opcache.jit=1255 -v,排除所有扩展干扰



















