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