## 1.JIT编译原理
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--------女
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