记录了解php8-JIT

## 1.JIT编译原理

1.1 JIT编译原理图
记录了解php8-JIT_第1张图片
1.2 Zend Opcache作用

  • 1.检查opcodes是否缓存
  • 2.zend compiler编译器进行编译生成opcodes
  • 3.optimizer优化器生成优化后的opcodes
  • 4.把优化后的opcodes放入opcodes cache缓存
  • 5.经过zend vm虚拟机生成opcodes handlers处理程序
  • 6.送入x86 cpu架构进行执行

1.3 JIT编译原理

  • 1.检查opcodes是否缓存
  • 2.zend compiler编译器进行编译生成opcodes
  • 3.optimizer优化器生成优化后的opcodes
  • 4.把优化后的opcodes放入opcodes cache缓存
  • 5.jit编译器把optimized opcodes再次编译成汇编机器码machine codes
  • 6.进入zend vm虚拟前先检查是否开启jit引擎
  • 7.如果已经开启了jit引擎则直接读取机器码中的jit buffer代码片段
  • 8.送入x86 cpu架构进行执行

1.3 Opcache示意图的关键点

  • PHP8的JIT目前是在Opcache之中提供的
  • JIT在Opcache优化之后的基础上,结合Runtime的信息再次优化,直接生成机器码
  • JIT不是原来Opcache优化的替代,是增强
  • 目前PHP8只支持x86架构的CPU

2.Opcache和JIT功能开启

2.1:opcache配置

#php.ini
zend_extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20200930/opcache.so
opcache.enable=1
opcache.enable_cli=1

2.2:jit配置

#php.ini
opcache.jit = 1205
opcache.jit_buffer_size = 64M

3.为什么要开启这个?

源代码(人认识)->字节码(解释器认识)->机器码(硬件认识)
1.来看下PHP的执行流程,假设有个a.php文件,不启用opacache的流程如下:
a.php->经过zend编译->opcode->PHP解释器->机器码
启用opacache的流程如下
a.php->查找opacache缓存,如果没有则进行zend编译为opcode并缓存->opacode->PHP解释器->机器码
2.启用jit的流程如下
a.php->编译->机器码
以后都只执行机器码,不编译,效率上高了很多

4.代码方面

1.命名参数

PHP 7
function test($name, $age='18', $sex='男') {
    echo $name . '-------' . $age . '--------'. $sex;
}
test('Landy', 20, '女'); //Landy-------20--------女
PHP 8
function test($name, $age='18', $sex='男') {
    echo $name . '-------' . $age . '--------'. $sex;
}
test('Landy', age: 20, sex: '女'); //Landy-------20--------女
---可以跳过参数
test('Landy', sex: '女'); //Landy-------20--------女
---参数的顺序可以不固定
test(age: 30, sex: '女', name: 'tom'); //tom-------30--------女

-------------------还可以这样
function test1($arg1,$arg2, ...$args) {
    print_r($args);
}
test1(1,2, name:'Landy', age:11, sex:2);
Array
(
    [name] => Landy
    [age] => 11
    [sex] => 2
)

2.match 表达式

PHP 7
switch (8.0) {
  case '8.0':
    $result = "Oh no!";
    break;
  case 8.0:
    $result = "This is what I expected";
    break;
}
echo $result;
//> Oh no!
PHP 8
echo match (8.0) {
  '8.0' => "Oh no!",
  8.0 => "This is what I expected",
};
//> This is what I expected

1.match 为表达式,意味着其结果可以存储在变量中或用于返回。
2.match 分支仅支持单行表达式,同时不需要 break; 语句。
3.match 使用严格比较。

//可以和表达式匹配
function test3() {
    return 8.0;
}
$a = 8.0;
$result = match($a) {
    test3() => '匹配函数',
    8.0 => '匹配8.0',
    '8.0' => 'test 8.0',
    9,10,11 => '多次匹配', //多次匹配
    default => '没有匹配值'
};  //匹配函数
echo $result



$input = "false";
$result = match($input) {
        "true" => 1,
};
//当input并不能被match中的所有条件满足的时候,match会抛出一个UnhandledMatchError exception:

3.构造函数里可直接定义属性

PHP 7
class Point {
  public float $x;
  public float $y;
  public float $z;

  public function __construct(
    float $x = 0.0,
    float $y = 0.0,
    float $z = 0.0
  ) {
    $this->x = $x;
    $this->y = $y;
    $this->z = $z;
  }
}
PHP 8
class Point {
  public function __construct(
    public float $x = 1.0,
    public float $y = 2.0,
    public float $z = 3.0,
  ) {}
}
echo (new Point())->x; // 1

你可能感兴趣的:(PHP,php)