84669 人学习
152542 人学习
20005 人学习
5487 人学习
7821 人学习
359900 人学习
3350 人学习
180660 人学习
48569 人学习
18603 人学习
40936 人学习
1549 人学习
1183 人学习
32909 人学习
opcache 是用于缓存 zend 引擎编译生成的 opcode,下次就无需编译。 最近听说了 php jit,看了一下 jit 的概念,描述是这样的:
JIT编译(just-in-time compilation),即即时编译,狭义指某段代码即将第一次被执行时进行编译,而后则不用编译直接执行,它为动态编译的一种特例。
那 php 的 jit 和 opcache 有什么区别呢?
源代码(人认识)->字节码(解释器认识)->机器码(硬件认识)来看下PHP的执行流程,假设有个a.php文件,不启用opacache的流程如下:a.php->经过zend编译->opcode->PHP解释器->机器码启用opacache的流程如下a.php->查找opacache缓存,如果没有则进行zend编译为opcode并缓存->opacode->PHP解释器->机器码启用jit的流程如下a.php->编译->机器码以后都只执行机器码,不编译,效率上高了很多
源代码(人认识)->字节码(解释器认识)->机器码(硬件认识)
a.php->经过zend编译->opcode->PHP解释器->机器码
a.php->查找opacache缓存,如果没有则进行zend编译为opcode并缓存->opacode->PHP解释器->机器码
a.php->编译->机器码
JIT这个概念其实来自Java,在Java里,JIT编译器是将字节码编译为机器码的过程。
如果把PHP和Java做对应,那么PHP编译成OpCode的过程就是Java编译为字节码的过程,而引申起来,PHP的JIT,也就是把OpCode编译为机器码的过程。
更简单的说,PHP程序编译成OpCode,而后交给PHP解释器取执行,这样的过程还是一个解释执行的过程。而如果通过JIT编译为机器码,那么程序的执行效率是可以得到大幅提高的。
目前热门的几个脚本语言,都已经拥有了自己的JIT,唯独PHP这方面还有欠缺。所以,有所期待吧,期待PHP 8
源代码(人认识)->字节码(解释器认识)->机器码(硬件认识)
来看下PHP的执行流程,假设有个a.php文件,不启用opacache的流程如下:
a.php->经过zend编译->opcode->PHP解释器->机器码
启用opacache的流程如下
a.php->查找opacache缓存,如果没有则进行zend编译为opcode并缓存->opacode->PHP解释器->机器码
启用jit的流程如下
a.php->编译->机器码
以后都只执行机器码,不编译,效率上高了很多
JIT这个概念其实来自Java,在Java里,JIT编译器是将字节码编译为机器码的过程。
如果把PHP和Java做对应,那么PHP编译成OpCode的过程就是Java编译为字节码的过程,而引申起来,PHP的JIT,也就是把OpCode编译为机器码的过程。
更简单的说,PHP程序编译成OpCode,而后交给PHP解释器取执行,这样的过程还是一个解释执行的过程。而如果通过JIT编译为机器码,那么程序的执行效率是可以得到大幅提高的。
目前热门的几个脚本语言,都已经拥有了自己的JIT,唯独PHP这方面还有欠缺。所以,有所期待吧,期待PHP 8