2020年,php8已经发布过版本,php开发者都在关心JIT这个特性,也在想原来的Opcache和JIT是什么关系,有区别吗,是两个不同的东西,还是升级,还是相互结合?

首先PHP8中的JIT不是原来Opcache优化的替代,是增强。

目录

使用Opcache与JIT后,php代码如何执行

源码(人认识)->字节码(解释器认识)->机器码(硬件认识)

来看下PHP的执行流程,假设有个x.php文件,不启用opacache的流程如下:

x.php->经过zend编译及优化->opcode->zend执行器->机器码

使用opacache的流程如下:

x.php->查找相应的opacache缓存的opcode,如果没有,则进行zend编译优化为opcode,并缓存opcode->PHP执行器->机器码

使用JIT的流程如下:

第一次:
x.php->查找相应的opacache缓存的opcode,如果没有,则进行zend编译优化为opcode,并缓存opcode->JIT编译->机器码

之后:
x.php->查找相应的opacache缓存的opcode,如果没有,则进行zend编译优化为opcode,并缓存opcode->找到相应的JIT Buffer(机器码)

我们来看一张鸟哥画的图会更清楚:

php-JIT-opcache [来源:PHP 8新特性之JIT简介 - 风雪之隅]

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

参考