PHP8内置JIT编译器,可以极大地提高性能,拥有更强的cpu密集处理能力。
开启JIT
修改配置文件php.ini:
;加载php_opcache拓展
zend_extension=php_opcache
;开启opcache,关闭则不会执行jit
opcache.enable=1
;开启cli模式opcache
opcache.enable_cli=1
编辑opcahce配置文件:
一般情况下软连接为/etc/php/8.3/fpm/conf.d/10-opcache.ini,实际链接的为文件为/etc/php/8.3/mods-available/opcache.ini
;开启JIT
opcache.jit=on
opcache.jit_buffer_size=256M
opcache.jit=1255
查看是否配置成功
使用phpinfo()查看jit状态
或者以下代码查看jit状态
var_dump(opcache_get_status()['jit']);
这里仅开启php-fpm中的JIT,如果需要在cli中开启,需要再修改cli目录下的php.ini。
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;
我的测试结果:
PHP5.6耗时10.6秒。
PHP7.2耗时5.7秒。
PHP7.4耗时3.08秒。
PHP8.3关闭JIT,耗时3.08秒,和PHP7.4相似。
PHP8.3开启JIT,仅用时0.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
默认是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。