• 记录了解php8-JIT


    ## 1.JIT编译原理
    
    • 1

    1.1 JIT编译原理图
    请添加图片描述
    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--------女
    
    • 1
    • 2
    • 3
    • 4
    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
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    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!
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    PHP 8
    echo match (8.0) {
      '8.0' => "Oh no!",
      8.0 => "This is what I expected",
    };
    //> This is what I expected
    
    • 1
    • 2
    • 3
    • 4
    • 5

    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:
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    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;
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • 相关阅读:
    EdgeConnect
    启航IT之旅:为新生绘制的学习路线图
    Vue中的数据绑定
    java中几种对象存储(文件存储)中间件的介绍
    论文阅读”Graph attention networks“(ICLR2018)
    2024年AI辅助研发:科技遇上创意,无限可能的绽放
    2023 泰山杯 --- Crypto wp
    深信服2023秋季校园招聘C++笔试A卷
    SAP 电商云 Spartacus 服务器端渲染的单步调试详细步骤
    这可能是最全的Web测试各个测试点,有这一篇就够了
  • 原文地址:https://blog.csdn.net/hgb24660/article/details/131003286