PHP中的jit配置

发布于 2022-01-18  5300 次阅读


PHP8在PHP的内核中添加了JIT编译器,开启后可以为程序增加一定的运行速度

要使用jit必须开启opcache

opcache的配置

// 加载opcache
zend_extension=opcache.so
// 开启opcache
opcache.enable=1
// OPcache共享内存存储大小,单位MB
opcache.memory_consumption=1024
// PHP使用了一种叫做字符串驻留,默认是4MB,建议设置为64
opcache.interned_strings_buffer=64
// 这个选项用于控制内存中最多可以缓存多少个PHP文件,这个选项必须得设置得足够大,大于你的项目中的所有PHP文件的总和
opcache.max_accelerated_files=80000
// 设置多少秒后重新验证脚本,如果设置为0,需要手动在每次 PHP 代码更改后手动清除opcache缓存
opcache.validate_timestamps=0
// 设置缓存的过期时间(单位是秒),为0的话每次都要检查
opcache.revalidate_freq=3
// 允许更快速关闭
opcache.fast_shutdown=1
// CLI环境下,PHP启用OPcache
opcache.enable_cli=1

jit的配置

opcache.jit是有点复杂的配置值。它接受disable,on,off,trace,function,和按顺序排列的4个不同标志的4位值

  • disable:在启动时完全禁用JIT功能,并且在运行时无法启用
  • off:禁用,但是可以在运行时启用JIT
  • on:启用tracing模式
  • tracing:细化配置,别名1254
  • function:细化配置,别名1205

其默认值为tracing,它在运行代码时编译热代码,并允许使用CPU寄存器和AVX扩展

jit标志

每个数字仅表示一个配置选项
以CRTO的形式,并接受C,R,T,O位置的以下值

C-CPU特定的优化标志

code说明
0不使用
1使用

R-寄存器分配

code说明
0不执行寄存器分配
1使用本地线性扫描寄存器分配器
2使用全局线性扫描寄存器分配器

T-JIT触发器

code说明
0PHP脚本载入的时候就JIT
1当函数第一次被执行时JIT
2在一次运行后,JIT调用次数最多的百分之(opcache.prof_threshold * 100)的函数
3当函数/方法执行超过N(N和opcache.jit_hot_func相关)次以后JIT
4当函数方法的注释中含有@jit的时候对它进行JIT
5当一个Trace执行超过N次(和opcache.jit_hot_loop,jit_hot_return等有关)以后JIT

O-优化级别

code说明
0最小JIT(调用标准VM处理程序)
1做opline之间的跳转部分的JIT
2基于单个函数的静态类型推断的优化JIT
4基于类型推断,过程调用图做函数级别JIT
5基于类型推断,过程调用图做脚本级别的JIT

基于以上的配置选项来说,应该尽量使用12x5型的配置,此时应该是效果最优的。
如果是脚本级别的,应该使用1205
如果是Web服务的,应该使用1255或1235

总之,应该根据自己项目的具体要求来配置jit

因此,JIT的推荐配置如下

opcache.jit_buffer_size=64
opcache.jit=1255