萬(wàn)眾矚目的PHP 8,預(yù)計(jì)將于今年年12月份發(fā)布 。根據(jù)已經(jīng)批準(zhǔn)和實(shí)施的RFC預(yù)案,可以PHP將帶來(lái)許多強(qiáng)大的功能和出色的語(yǔ)言改進(jìn) 。作為嘗鮮,讓我們一起來(lái)展望一下PHP8的新功能和改進(jìn) 。

文章插圖
文章插圖
PHP JIT(即時(shí)編譯器)很多人可能已經(jīng)了解,PHP 8中最令人期望功能是JIT功能 。在此我們先介紹一下JIT,根據(jù)PHP RFC提案:
“PHP JIT為Opcache部分的獨(dú)立實(shí)現(xiàn) 。它可以在PHP編譯時(shí)和運(yùn)行時(shí)啟用/禁用 。啟用后,PHP文件的本機(jī)代碼將存儲(chǔ)在OPcache共享內(nèi)存的附加區(qū)域中,并且op_array→o??pcodes [] 。handler指針指向JIT版本代碼的入口點(diǎn) 。”
為了更好地理解什么是JIT for PHP,我review一下如何從源代碼執(zhí)行到最終結(jié)果 。
PHP執(zhí)行過(guò)程分為四個(gè)階段:
Lexing/Tokenizing:解釋器讀取PHP代碼并構(gòu)建一組令牌 。
語(yǔ)法解析:解釋器檢查腳本是否與語(yǔ)法規(guī)則匹配,并使用標(biāo)記來(lái)構(gòu)建抽象語(yǔ)法樹(AST),AST是源代碼結(jié)構(gòu)的分層表示 。
編譯:解釋器遍歷樹并將AST節(jié)點(diǎn)轉(zhuǎn)換為低級(jí)Zend操作碼,這些操作碼是確定Zend VM執(zhí)行的指令類型的數(shù)字標(biāo)識(shí)符 。
解釋:操作碼將在Zend VM上解釋并運(yùn)行 。
基本PHP執(zhí)行過(guò)程的直觀表示如下:

文章插圖
文章插圖
那么,OPcache如何讓PHP執(zhí)行的更快?JIT執(zhí)行過(guò)程中有哪些變化?
OPcache擴(kuò)展由于PHP是一種解釋型語(yǔ)言,當(dāng)運(yùn)行PHP腳本時(shí),解釋器將在每次請(qǐng)求時(shí)都會(huì)重復(fù)地解析,編譯和執(zhí)行代碼的過(guò)程 。這會(huì)導(dǎo)致CPU浪費(fèi)和其他資源耗費(fèi),讓執(zhí)行時(shí)間增加 。
“OPcache通過(guò)將預(yù)編譯的腳本字節(jié)碼存儲(chǔ)在共享內(nèi)存中來(lái)提高PHP性能,從而消除了PHP在每個(gè)請(qǐng)求上加載和解析腳本的需要 。”
啟用OPcache后,PHP解釋器僅在腳本首次運(yùn)行時(shí)才進(jìn)行4個(gè)階段的過(guò)程 。由于PHP字節(jié)碼存儲(chǔ)在共享內(nèi)存中,因此可以作為低級(jí)中間表示形式緩存(OP)來(lái)被重復(fù)使用,可以立即在Zend VM上執(zhí)行 。

文章插圖
文章插圖
從PHP 5.5開始,Zend OPcache擴(kuò)展在默認(rèn)情況下啟動(dòng),可以通過(guò)可以phpinfo()在Zend OPcache來(lái)查看Opcache配置情況 。

文章插圖
文章插圖
預(yù)加載(Reload)預(yù)加載是PHP 7.4新增的OPcache新功能 。預(yù)加載提供了一種”在運(yùn)行任何應(yīng)用程序代碼之前”將指定的腳本集存儲(chǔ)到OPcache內(nèi)存中的方法,但是對(duì)于典型的基于Web的應(yīng)用程序而言,它不會(huì)帶來(lái)明顯的性能提升 。
JIT —及時(shí)編譯器即使操作碼采用低級(jí)中間表示碼形式,仍然需要將其編譯為機(jī)器代碼 。JIT”不引入任何其他IR(中間表示)形式”,使用DynASM(用于代碼生成引擎的動(dòng)態(tài)匯編程序)直接從PHP字節(jié)碼生成本機(jī)代碼 。
簡(jiǎn)而言之,JIT將中間碼的熱門部分轉(zhuǎn)換為機(jī)器代碼 。繞過(guò)編譯,它將能夠顯著的提高性能和內(nèi)存使用率 。
實(shí)時(shí)Web應(yīng)用的JIT根據(jù)JIT RFC,即時(shí)編譯器實(shí)現(xiàn)應(yīng)提高PHP性能 。但是,我們真的會(huì)在WordPress等現(xiàn)實(shí)應(yīng)用中體驗(yàn)到這種改進(jìn)嗎?
早期測(cè)試表明,JIT可以使CPU密集型工作負(fù)載的運(yùn)行速度大大提高,但是對(duì)WordPress等應(yīng)用并不能帶來(lái)顯著性能提高 。
啟用JIT后,代碼將不會(huì)由Zend VM運(yùn)行,而是由CPU本身運(yùn)行,這將提高計(jì)算速度 。諸如WordPress之類的Web應(yīng)用程序還依賴于TTFB,數(shù)據(jù)庫(kù)優(yōu)化,HTTP請(qǐng)求等其他因素 。
因此,當(dāng)涉及到WordPress和類似的應(yīng)用程序時(shí),不應(yīng)該期望PHP的執(zhí)行速度會(huì)大大提高 。但是,JIT可以為開發(fā)人員帶來(lái)一些好處 。
經(jīng)驗(yàn)總結(jié)擴(kuò)展閱讀
- 2020年11月開始施行 交通違法記分罰款有重大調(diào)整
- 常見的SEM面試題及最佳答案 sem面試技巧
- 乒乓球底板用什么木做最好
- 裙裝 優(yōu)雅女人到底是什么樣子?裙裝和頭發(fā)的細(xì)節(jié),最能證明一切
- 下雨天怎么發(fā)朋友圈表示一下心情2022最新
- 女孩起名大全2020最新版
- 2020年屬鼠新生寶寶取名字大全
- 2020年鼠年女孩取名用字技巧
- 2020年屬鼠男孩寓意好的名字
- 2020年屬鼠男孩怎樣起名字
