opcache 是用來(lái)快取 zend 引擎編譯產(chǎn)生的 opcode,下次就不需要編譯。
最近聽(tīng)說(shuō)了 php jit,看了一下 jit 的概念,描述是這樣的:
JIT編譯(just-in-time compilation),即時(shí)編譯,狹義指某段程式碼即將第一次被執(zhí)行時(shí)進(jìn)行編譯,而後則不用編譯直接執(zhí)行,它為動(dòng)態(tài)編譯的一種特例。
那 php 的 jit 和 opcache 有什麼差別呢?
原始碼(人認(rèn)識(shí))->字節(jié)碼(解釋器認(rèn)識(shí))->機(jī)器碼(硬體認(rèn)識(shí))
來(lái)看下PHP的執(zhí)行流程,假設(shè)有個(gè)a.php文件,不啟用opacache的流程如下:a.php->經(jīng)過(guò)zend編譯->opcode->PHP解釋器->機(jī)器碼
啟用opacache的流程如下a.php->查找opacache緩存,如果沒(méi)有則進(jìn)行zend編譯為opcode並快取->opacode->PHP解釋器->機(jī)器碼
啟用jit的流程如下a.php->編譯->機(jī)器碼
以後都只執(zhí)行機(jī)器碼,不編譯,效率上高了很多
JIT這個(gè)概念其實(shí)是來(lái)自Java,在Java裡,JIT編譯器是將字節(jié)碼編譯為機(jī)器碼的過(guò)程。
如果把PHP和Java做對(duì)應(yīng),那麼PHP編譯成OpCode的過(guò)程就是Java編譯為字節(jié)碼的過(guò)程,而引申起來(lái),PHP的JIT,也就是把OpCode編譯為機(jī)器碼的過(guò)程。
更簡(jiǎn)單的說(shuō),PHP程式編譯成OpCode,而後交給PHP解釋器取執(zhí)行,這樣的過(guò)程還是一個(gè)解釋執(zhí)行的過(guò)程。而如果透過(guò)JIT編譯為機(jī)器碼,那麼程式的執(zhí)行效率是可以大幅提高的。
目前熱門(mén)的幾個(gè)腳本語(yǔ)言,都已經(jīng)擁有了自己的JIT,唯獨(dú)PHP這方面還有欠缺。所以,有所期待吧,期待PHP 8