LNMP
PHP8开启JIT,PHP8开启JIT的执行速度
09-06 16:54PHP8内置JIT编译器,可以极大地提高性能,拥有更强的cpu密集处理能力。
1、cli下开启JIT
⑴ 修改 cli 的配置文件 php.ini
;开启opcache,关闭则不会执行jit
opcache.enable=1
;开启cli模式opcache
opcache.enable_cli=1
;建议在开发服务器中将下面的参数的值改为0,让 php 在每次运行时校对一下文件修改时间,使修改实时生效
opcache.revalidate_freq=0
;OPcache 共享内存存储池的总大小(单位:MB)。该值决定了 OPcache 能同时缓存多少 PHP 脚本的编译结果
opcache.memory_consumption=512
;OPcache 中用于存储“驻留字符串”(interned strings)的内存池大小(单位:MB)
opcache.interned_strings_buffer=32
;OPcache 哈希表中可缓存的最大脚本文件数量,限制 OPcache 能缓存的 PHP 文件数量上限(包括项目代码和 vendor 依赖)
opcache.max_accelerated_files=20000
注意:在 cli 模式下,opcache.enable 和 opcache.enable_cli 是且的关系,必须全部开启

⑵ 编辑 opcahce 配置文件
一般情况下路径为/etc/php/8.0/cli/conf.d/10-opcache.ini,实际链接的为文件为/etc/php/8.0/mods-available/opcache.ini
;开启JIT
zend_extension=opcache.so
; JIT 编译生成的机器码专用的内存缓冲池,用于存放 PHP 在运行时将“热点字节码”编译成的CPU可直接执行的机器码(重要)
opcache.jit_buffer_size=256M
opcache.jit=tracing
生产环境可以使用 opcache.jit=1255 代替 opcache.jit=tracing,通过四个数字精确控制 JIT 的编译行为,在 Web 场景下往往能获得更好的性能表现,文章末尾有对 1255 的详细介绍。

2、查看是否配置成功
⑴ 查看 jit 配置
php -i | grep -E "opcache\.jit|opcache\.enable_cli"
有以下输出表示成功

⑵ 查看 JIT 运行时状态(最准确)
php -r "print_r(opcache_get_status()['jit'] ?? 'JIT not enabled');"
如果 JIT 已生效,会有类似如下输出

3、php-fpm开启jit
编辑 fpm 目录下的 php.ini,修改的配置和 cli 相同。需要注意一点,fpm 配置文件中的 opcache.enable_cli=1 无实际意义,这个配置仅针对 cli 中的 opcache 。
在网页中查看 fpm 是否开启 jit

通过以下代码查看 jit 状态
var_dump(opcache_get_status()['jit']);

4、PHP开启JIT后的执行速度
运行下面脚本,从零加到一亿,测试不同PHP版本执行速度,以及开启JIT后的执行速度:
$time=microtime(true);
$number=0;
for($i=0;$i<=100000000;$i++)
$number+=$i;
echo $number;
echo '<hr>';
echo microtime(true)-$time;
用一台复古主机 j1900 做的测试结果:
→ PHP5.6耗时10.6秒。

→ PHP7.2耗时5.7秒。

→ PHP7.4耗时3.08秒。

→ PHP8.3关闭JIT,耗时3.08秒,和PHP7.4相似。

→ PHP8.3开启JIT,仅用时0.5秒。

5、补充说明一下opcache.jit=1255的意思:
⑴ opcache.jit 配置项,是专门配置:优化级别 | JIT触发器 | 寄存器分配 | CPU特定 的优化标志,官方给的推荐值为1255。配置的顺序是:
① CPU特定的优化标志;
② 寄存器分配;
③ JIT触发器;
④ 优化级别。
⑵ 具体到参数:
① CPU特定的优化标志:
0:没有
1:启用 AVX 指令生成
② R-寄存器分配:
0:不执行寄存器分配
1:使用本地线性扫描寄存器分配器
2:使用全局线性扫描寄存器分配器
③ JIT触发器:
0:JIT在第一次脚本加载时的所有功能
1:首次执行时的JIT函数
2:在第一个请求时进行概要分析,并在第二个请求时编译热功能
3:动态分析并编译热功能
4:在文档注释中使用@jit标记编译函数
5:跟踪JIT
④ O-优化级别:
0:不要准时
1:最小JIT(调用标准VM处理程序)
2:选择性VM处理程序内联
3:基于单个函数的静态类型推断的优化JIT
4:静态类型推断和调用树的优化JIT
5:基于静态类型推断和内部过程分析的优化JIT
⑶ opcache.jit 的值,默认是 tracing,也可以 function。
tracing 是 1254,C=1,R=2,T=5,O=4 的别名。
function 是 1205,是C=1,R=2,T=0,O=5 的别名。
官方最近值是 1255,意思是:启用AVX指令生成,使用本地线性扫描寄存器分配器,跟踪JIT,基于静态类型推断和内部过程的分析优化JIT。