JIT 依赖三个硬性条件:OPcache 必须启用(opcache.enable=1 且 CLI 场景需 opcache.enable_cli=1)、opcache.jit_buffer_size ≥1M(推荐64M起)且显式配置、opcache.jit 值为合法四位数(如1255)或 tracing/function;32位系统不支持,需64位环境及 CPU 支持 cx16 等指令集。

确认 JIT 依赖条件是否全部满足
JIT 不是独立开关,它必须同时满足三个硬性前提:OPcache 已启用、opcache.jit 配置项显式设置、PHP 运行在支持的 CPU 架构上。缺一不可。
- 检查
opcache.enable=1(FPM 和 CLI 的 php.ini 都要确认) - 确认
opcache.jit行未被注释,且值为合法组合(如1255、tracing或function),不能是0或空值 - 运行
php -r "echo PHP_INT_SIZE;"确认是 64 位环境;JIT 在 32 位下完全不可用 - 执行
cat /proc/cpuinfo | grep flags查看是否含cx16(x86_64 必需)、popcnt(推荐)等指令集
排除扩展与插件兼容性干扰
宝塔面板、Swoole、Xdebug、某些老版本 Redis/GD 扩展,或使用反射/动态类加载的插件,会与 JIT 的运行时机制冲突,导致 JIT 初始化失败甚至进程崩溃。
- 临时禁用所有非必要扩展:
php -d extension= -d zend_extension= -v,再加-d opcache.jit=1255测试是否报错 - 重点排查
xdebug.so(必须卸载或注释)、swoole.so(需 ≥ 5.0.3 且关闭swoole.enable_coroutine=Off)、redis.so(需 ≥ 5.3.7) - 宝塔用户请勿直接开启 JIT——其默认 PHP 安装包中多数插件未适配,强行启用易致白屏或 Segfault
验证 JIT 是否真正加载成功
仅看配置不等于 JIT 在工作。很多情况是配置写了,但 Zend VM 内部因条件不满足而静默跳过 JIT 编译路径。
- 执行
php --ri opcache | grep -i jit,若输出含JIT enabled且有opcache.jit_buffer_size值,说明加载成功 - 若输出为空或显示
JIT disabled,说明未激活,需回查上两步 - 更可靠方式:写一个纯计算循环脚本(如百万次浮点乘法),分别在
opcache.jit=0和=1255下运行 5 次取平均耗时,差异 ≥ 15% 才算 JIT 实际生效
检查日志与系统限制
部分 JIT 失败不会抛出明显错误,而是记录在 PHP 错误日志或系统内核日志中。
立即学习“PHP免费学习笔记(深入)”;
- 查看 PHP-FPM 错误日志(如
/www/wwwlogs/php-fpm.log),搜索jit、segmentation fault、mmap、Permission denied - 检查 SELinux 或 AppArmor 是否拦截了 mmap 内存映射:
ausearch -m avc -ts recent | grep php - 确认
opcache.jit_buffer_size设置合理(建议从64M起步),过小会导致 JIT 缓冲区满后自动降级



















