到目前為止,PHP仍然是用于創(chuàng)建網(wǎng)站的最流行的服務(wù)器端語(yǔ)言。
全球估計(jì)有80%以上的市場(chǎng)份額,這個(gè)二十幾歲的編程語(yǔ)言已經(jīng)無(wú)處不在。PHP仍然在發(fā)展,接下來(lái)的主要內(nèi)容是PHP 8.0.0和它的JIT(實(shí)時(shí))編譯。我們來(lái)看看這些新東東。
PHP的當(dāng)前版本是7.0。此版本是一個(gè)重要的里程碑,性能顯著提高,內(nèi)存使用率降低。自7.0以來(lái),有兩個(gè)版本添加了重要功能:2016年的7.1和2017年的7.2版。
PHP 8.0的發(fā)布時(shí)間尚未確定,但由于這是一個(gè)重大的飛躍,它將需要幾年時(shí)間的等待,這些功能也沒(méi)有太詳細(xì)說(shuō)明,估計(jì)需要幾年時(shí)間。在Twitter上一些人猜測(cè)認(rèn)為PHP 8.0.0的發(fā)布將于2021年9月份:
2021年9月23日,#PHP 8的發(fā)布日期。@ Savara預(yù)測(cè)它!#SymfonyCon- 拉里加菲爾德(@Crell)
PHP的實(shí)時(shí)編譯引擎(JIT)
實(shí)時(shí)編譯是一種優(yōu)化運(yùn)行代碼的方法,它是Java虛擬機(jī)(JVM)使用的流行方法,包括Google推出的流行V8 JavaScript VM。這兩個(gè)語(yǔ)言都使用JIT,但它并不是銀彈。
PHP 實(shí)現(xiàn)了一個(gè)Zend VM,它會(huì)將人類可讀腳本編譯成虛擬機(jī)理解的指令,也就是操作碼,這個(gè)執(zhí)行階段就是“編譯時(shí)(Compile Time)”;在“運(yùn)行時(shí)(Runtime)”執(zhí)行階段,虛擬機(jī) Zend VM 會(huì)執(zhí)行這些編譯好的操作碼。
通常編譯時(shí)與運(yùn)行時(shí)兩個(gè)階段是獨(dú)立分開(kāi)的,腳本編譯完成后,像 APC 與 OPCache 這樣的字節(jié)碼緩存組件會(huì)緩存這些操作碼。而 JIT 去掉了編譯時(shí)階段,它將這編譯時(shí)與運(yùn)行時(shí)兩個(gè)階段合為一體,實(shí)現(xiàn)即時(shí)編譯與執(zhí)行。
JIT 是一種編譯器策略,它將代碼表述為一種中間狀態(tài),在運(yùn)行時(shí)將其轉(zhuǎn)換為依賴于體系結(jié)構(gòu)的機(jī)器碼,并即時(shí)執(zhí)行。在 PHP 中,這意味著 JIT 將為 Zend VM 生成的指令視為中間表述,并以依賴于體系結(jié)構(gòu)的機(jī)器碼執(zhí)行,也就是說(shuō)托管代碼的不再是 Zend VM,而是更為底層的 CPU。
雖然自 PHP 7.0 以來(lái),通過(guò)優(yōu)化核心數(shù)據(jù)結(jié)構(gòu) HashTable、強(qiáng)化 Zend VM 中某些操作碼與持續(xù)改進(jìn) OPCache 的 Optimizer 組件等具體措施,PHP 性能得到了顯著提升,但是實(shí)際上這些優(yōu)化似乎已經(jīng)走到極限了?,F(xiàn)在 JIT 從底層著手,被認(rèn)為是目前提升 PHP 性能的最佳出路。
關(guān)于是否引入 JIT 的官方投票結(jié)果已于近日公布,因?yàn)榇蟛糠趾诵拈_(kāi)發(fā)者投了贊成票,所以 PHP 8 中將會(huì)支持 JIT。
在演進(jìn)之前的PHP(PHP 7.x)側(cè)重于使用JIT改進(jìn)PHP性能。這項(xiàng)工作在基準(zhǔn)測(cè)試中顯示取得了相當(dāng)大的改進(jìn),但事實(shí)證明,在WordPress或Joomla等應(yīng)用中幾乎沒(méi)有太大變化。因?yàn)?JIT 在 CPU 密集型的代碼上效果最好,而一般情況下,用 PHP 編寫(xiě)的程序都是 I/O 密集型的。
簡(jiǎn)單來(lái)說(shuō)就是,PHP 程序往往受限于 I/O 而不是 CPU,使 PHP 代碼運(yùn)行速度變慢的因素往往是它們正在執(zhí)行的 I/O 操作,包括連接、讀取和寫(xiě)入數(shù)據(jù)庫(kù)、高速緩存、文件與套接字等。
PHP 中 CPU 密集型代碼的一個(gè)例子是 Zend/bench.php。
那么 PHP 中的 JIT 將會(huì)在哪里發(fā)揮作用呢?答案是數(shù)學(xué)領(lǐng)域。關(guān)于 PHP JIT 的詳細(xì)介紹,可以查看:
https://blog.krakjoe.ninja/2019/03/php-gr8.html
小結(jié)
JIT和PHP8.0都將在PHP的未來(lái)出現(xiàn),它們都是未來(lái)的重要特性。尤其對(duì)于JIT而言,PHP的短生命周期對(duì)于JIT實(shí)現(xiàn)并不是特別理想,這與持續(xù)運(yùn)行的進(jìn)程語(yǔ)言(如Node.js或Java)相比較。