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 | 说明 |
---|---|
0 | PHP 脚本载入的时候就 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
Comments 5 条评论
感谢分享,赞!
鸟叔来串门,通过虫洞穿梭至此,期待回访!
请问你用的图片 api 是啥呀?
@Marshiro 自建的
感谢分享 赞一个