PHP 8 正式版已经发布了有一段时间了,相应的框架及配套组件都相应的开始支持了,自己也是把玩了一下,来简单记录一下 PHP 8 的特性。
首先, PHP 8 是一个里程碑版本,官网出了一个专门的落地页来介绍:
传送门:官网 PHP 8 新特性介绍页
这里简单总结一下页面提及的重点:
- 命名参数
- 注解
- 构造器属性提升
- 联合类型
- match 表达式
- null safe 运行符
- 字符串的比较更符合逻辑
- JIT
因为官网的页面写的很清楚了,推荐大家直接看官方介绍页面,这里写一下官网没有详细说明的但是又很重大的一个特性:JIT
JIT 介绍
JIT (Just-In-Time) 即时编译是 PHP 8 中重要的新功能之一。它可以将 PHP 程序执行的全部或者部分经常调用的部分编译成 CPU 可执行的机器码并直接交予 CPU 直接执行,通过这种方式绕过了 Zend VM 及其过程,从而提升性能。
听着很像 Opcache 啊,没错,这玩意开启的话,必须有 Opcache 支持,了解 PHP 代码执行原理的话,还是知道有区别的。
我们看下面这个流程图:
┌────────────────┐ │ php code │ └───────┬────────┘ │ │ │┌──────────────────▼────────────────────┐│ ││ Opcache ││ ┌────────────────┐ ││ │ │ ││ │ JIT Buffer │ ││ │ │ ││ │ │ ││ │ │ ││ │ Machine Code │ ││ └─────▲───────┬──┘ ││ Op Codes │ │ ││ │ │ │└────┬───────────┬────────┼───────┼─────┘ │ │ │ │ │ │ │ │ │ ┌──▼────────┴────┐ │ │ │ JIT Compiler │ │ │ └────▲───────────┘ │ │ │ │ │ │ │┌────▼─────────────┴─────┐ ││ Zend Virtual Machine │ │└───────────┬────────────┘ │ │ │ │ │ │ │ ┌──────────▼─────────────────────▼──────┐ │ │ │ CPU │ │ │ └───────────────────────────────────────┘PHP JIT 被实现为 Opcache 的一部分。
这一点在官网 RFC 上面也是有说的:https://wiki.php.net/rfc/jit
更详细的一些的 JIT 原理,也可以看上面的 RFC , 这里就不细说了,我们再来看看怎么配置使用吧。
既然是 Opcache 的一部分,那么要启用 JIT 就必须启用 Opcache 。
配置 JIT
- 启用 Opcache
- 增加 JIT 的配置项 (截止当前日期,默认配置文件是没有在配置文件中注明的)
关键配置如下:
[opcache]; Determines if Zend OPCache is enabledopcache.enable=1
; Determines if Zend OPCache is enabled for the CLI version of PHPopcache.enable_cli=1
;开启**JIT**的debug; opcache.jit_debug=1
;默认是tracing,也可以function,官方推荐值是1255,含义可以参照上述 RFC 文档,里面有说明opcache.jit=1255opcache.jit_buffer_size=100M性能测试
这里使用官网的性能测试文件:https://raw.githubusercontent.com/php/php-src/master/Zend/bench.php
php bench.php看一下开启了 JIT 和没有开启 JIT 的性能结果:
# 开启 **JIT**simple 0.001simplecall 0.001simpleucall 0.001simpleudcall 0.001mandel 0.007mandel2 0.008ackermann(7) 0.011ary(50000) 0.006ary2(50000) 0.010ary3(2000) 0.011fibo(30) 0.026hash1(50000) 0.010hash2(500) 0.006heapsort(20000) 0.011matrix(20) 0.008nestedloop(12) 0.005sieve(30) 0.005strcat(200000) 0.004------------------------Total 0.131
# 未开启 **JIT**simple 0.015simplecall 0.008simpleucall 0.008simpleudcall 0.008mandel 0.061mandel2 0.085ackermann(7) 0.028ary(50000) 0.008ary2(50000) 0.009ary3(2000) 0.053fibo(30) 0.094hash1(50000) 0.011hash2(500) 0.011heapsort(20000) 0.031matrix(20) 0.031nestedloop(12) 0.040sieve(30) 0.016strcat(200000) 0.010------------------------Total 0.527综合性能大致在 4 倍左右的性能差异,性能提升还是挺可观的。
总结
PHP 8 作为里程碑的一个版本,在性能和语法使用及强类型使用方面带来了改进,引用官网的一句话说就是:性能更好,语法更好,类型安全更完善。