PHP 8 正式版已经发布了有一段时间了,相应的框架及配套组件都相应的开始支持了,自己也是把玩了一下,来简单记录一下 PHP 8 的特性。

首先, PHP 8 是一个里程碑版本,官网出了一个专门的落地页来介绍:

传送门:官网 PHP 8 新特性介绍页

这里简单总结一下页面提及的重点:

  1. 命名参数
  2. 注解
  3. 构造器属性提升
  4. 联合类型
  5. match 表达式
  6. null safe 运行符
  7. 字符串的比较更符合逻辑
  8. 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

  1. 启用 Opcache
  2. 增加 JIT 的配置项 (截止当前日期,默认配置文件是没有在配置文件中注明的)

关键配置如下:

[opcache]
; Determines if Zend OPCache is enabled
opcache.enable=1

; Determines if Zend OPCache is enabled for the CLI version of PHP
opcache.enable_cli=1

;开启**JIT**的debug
; opcache.jit_debug=1

;默认是tracing,也可以function,官方推荐值是1255,含义可以参照上述 RFC 文档,里面有说明
opcache.jit=1255
opcache.jit_buffer_size=100M
 

性能测试

这里使用官网的性能测试文件:https://raw.githubusercontent.com/php/php-src/master/Zend/bench.php

php bench.php

看一下开启了 JIT 和没有开启 JIT 的性能结果:

# 开启 **JIT**
simple             0.001
simplecall         0.001
simpleucall        0.001
simpleudcall       0.001
mandel             0.007
mandel2            0.008
ackermann(7)       0.011
ary(50000)         0.006
ary2(50000)        0.010
ary3(2000)         0.011
fibo(30)           0.026
hash1(50000)       0.010
hash2(500)         0.006
heapsort(20000)    0.011
matrix(20)         0.008
nestedloop(12)     0.005
sieve(30)          0.005
strcat(200000)     0.004
------------------------
Total              0.131

# 未开启 **JIT**
simple             0.015
simplecall         0.008
simpleucall        0.008
simpleudcall       0.008
mandel             0.061
mandel2            0.085
ackermann(7)       0.028
ary(50000)         0.008
ary2(50000)        0.009
ary3(2000)         0.053
fibo(30)           0.094
hash1(50000)       0.011
hash2(500)         0.011
heapsort(20000)    0.031
matrix(20)         0.031
nestedloop(12)     0.040
sieve(30)          0.016
strcat(200000)     0.010
------------------------
Total              0.527

综合性能大致在 4 倍左右的性能差异,性能提升还是挺可观的。

总结

PHP 8 作为里程碑的一个版本,在性能和语法使用及强类型使用方面带来了改进,引用官网的一句话说就是:性能更好,语法更好,类型安全更完善。

打赏不准超过你工资的一半!!!