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