PHP內(nèi)核探索 —— Zend引擎:Zend引擎是PHP實(shí)現(xiàn)的核心
相信很多人都聽說(shuō)過(guò) Zend Engine 這個(gè)名詞,也有很多人知道 Zend Engine 就是 PHP 語(yǔ)言的核心,但若要問(wèn)一句:Zend Engine 到底存在于何處?或者說(shuō),Zend Engine 究竟是在什么時(shí)候怎么發(fā)揮作用讓 PHP 源碼輸出我們想要的東西的?
Zend引擎是PHP實(shí)現(xiàn)的核心,提供了語(yǔ)言實(shí)現(xiàn)上的基礎(chǔ)設(shè)施。例如:PHP的語(yǔ)法實(shí)現(xiàn),腳本的編譯運(yùn)行環(huán)境, 擴(kuò)展機(jī)制以及內(nèi)存管理等,當(dāng)然這里的PHP指的是官方的PHP實(shí)現(xiàn)(除了官方的實(shí)現(xiàn), 目前比較知名的有facebook的hiphop實(shí)現(xiàn),不過(guò)到目前為止,PHP還沒(méi)有一個(gè)標(biāo)準(zhǔn)的語(yǔ)言規(guī)范),而PHP則提供了請(qǐng)求處理和其他Web服務(wù)器的接口(SAPI)。
要理解 Zend Engine 的作用,就不能不理解為什么會(huì)出現(xiàn),PHP 為什么需要 Zend Engine, Zend Engine 的出現(xiàn)為 PHP 解決了什么問(wèn)題。PHP 發(fā)展到 3.0 版本的時(shí)候,此時(shí) PHP 已經(jīng)很普及了。“在 PHP3 的頂峰,Internet 上 10% 的 web 服務(wù)器上都安裝了它”,PHP Manual 如是說(shuō)。廣泛的應(yīng)用必然帶來(lái)更高的要求。但此時(shí)的 PHP3 卻有些力不從心了,這主要是因?yàn)?PHP3 采用的是邊解釋邊執(zhí)行的運(yùn)行方式,運(yùn)行效率很受其影響。其次,代碼整體耦合度比較高,可擴(kuò)展性也不夠好,不利于應(yīng)付各種各樣需求。因此,此時(shí)在 PHP 界里已經(jīng)有點(diǎn)中流砥柱作用的 Zeev Suraski 和 Andi Gutmans 決定重寫代碼以解決這兩個(gè)問(wèn)題。最終他們倆把該項(xiàng)技術(shù)的核心引擎命名為 Zend Engine,Zend 的意思即為 Zeev + Andi 。
Zend Engine 最主要的特性就是把 PHP 的邊解釋邊執(zhí)行的運(yùn)行方式改為先進(jìn)行預(yù)編譯(Compile),然后再執(zhí)行(Execute)。這兩者的分開給 PHP 帶來(lái)了革命性的變化:執(zhí)行效率大幅提高;由于實(shí)行了功能分離,降低了模塊間耦合度,可擴(kuò)展性也大大增強(qiáng)。此時(shí) PHP 已經(jīng)能很方便的應(yīng)付各種各樣的 BT 需求了,而伴隨 PHP 4.4.x ―可能是 PHP4 系列的最后一個(gè)分支―的發(fā)布,PHP 的大部分開發(fā)人員已經(jīng)將注意力放在了 PHP5 或者 PHP6 上面,以后發(fā)布的基本上就是一些 Bug Fix Release。可以說(shuō)第一代的 Zend Engine 是已經(jīng)在站最后一班崗了。
2004 年 7 月,PHP 5 發(fā)布,支持 PHP5 的是 Zend Engine 2.0 版本。這個(gè)版本主要是對(duì) PHP 的 OO 功能進(jìn)行了改進(jìn)(我沒(méi)有提集成 SQLite、PDO 等特性是因?yàn)槲覀儸F(xiàn)在談的主要是 Zend Engine 而非 PHP)。核心執(zhí)行方式(非 OO 部分)較PHP4 的1.0 版本變動(dòng)不大,所以 PHP5 純粹的執(zhí)行速度相對(duì)于 PHP4 沒(méi)有大的提高。而預(yù)計(jì)將于本月中旬發(fā)布的 PHP 5.1 版本則會(huì)攜帶 Zend Engine 2.1 版本,這個(gè)版本將提供新的執(zhí)行方式,執(zhí)行速度也會(huì)快上許多,至少要比 PHP5.0 相對(duì)于 PHP4.x 的差別要大很多,所以,PHP 5.1 將會(huì)是一個(gè)很了很令人期待的版本。
但并非 PHP5 系列的 Zend Engine 2 就完美無(wú)缺了。前面已經(jīng)提到過(guò),Zend Engine 將代碼分成編譯和執(zhí)行兩大部分。一般情況下,我們的代碼完成以后就很少再去改變了。但執(zhí)行時(shí) PHP 卻不得不還得一次又一次的重復(fù)編譯,這根本就是毫無(wú)必要的。而且通常情況下,編譯的所花費(fèi)的時(shí)間并不比執(zhí)行少多少,說(shuō)是五五開并不為過(guò),因此這極大的浪費(fèi)了機(jī)器的 CPU。基于 Zend Engine 3.0 的 PHP6 將試圖解決這個(gè)問(wèn)題。除此之外,目前的 PHP 對(duì)多字節(jié)的字符處理也是 PHP 的一大致命缺陷。這在人們聯(lián)系日益國(guó)際化的今天幾乎是不可忍受的。而無(wú)數(shù)人在抨擊 PHP 或 比較 ASP 等同類語(yǔ)言時(shí)總是不可避免的要提到這一點(diǎn)。同時(shí)受到 IBM 方面的壓力,PHP6 也將會(huì)把對(duì)多字節(jié)字符的處理提到首要日程。這在 PHP6 的 Dev 版本中已經(jīng)得到體現(xiàn)。
目前PHP的實(shí)現(xiàn)和Zend引擎之間的關(guān)系非常緊密,甚至有些過(guò)于緊密了,例如很多PHP擴(kuò)展都是使用的Zend API, 而Zend正是PHP語(yǔ)言本身的實(shí)現(xiàn),PHP只是使用Zend這個(gè)內(nèi)核來(lái)構(gòu)建PHP語(yǔ)言的,而PHP擴(kuò)展大都使用Zend API, 這就導(dǎo)致PHP的很多擴(kuò)展和Zend引擎耦合在一起了,后來(lái)才有PHP核心開發(fā)者就提出將這種耦合解開的建議。
目前PHP的受歡迎程度是毋庸置疑的,但凡流行的語(yǔ)言通常都會(huì)出現(xiàn)這個(gè)語(yǔ)言的其他實(shí)現(xiàn)版本, 這在Java社區(qū)里就非常明顯,目前已經(jīng)有非常多基于JVM的語(yǔ)言了,例如IBM的Project Zero就實(shí)現(xiàn)了一個(gè)基于JVM的PHP實(shí)現(xiàn), .NET也有類似的實(shí)現(xiàn),通常他們這樣做的原因無(wú)非是因?yàn)椋核麄兿矚g這個(gè)語(yǔ)言,但又不想放棄原有的平臺(tái), 或者對(duì)現(xiàn)有的語(yǔ)言實(shí)現(xiàn)不滿意,處于性能或者語(yǔ)言特性等(HipHop就是這樣誕生的)。
很多腳本語(yǔ)言中都會(huì)有語(yǔ)言擴(kuò)展機(jī)制,PHP中的擴(kuò)展通常是通過(guò)Pear庫(kù)或者原生擴(kuò)展,在Ruby中則這兩者的界限不是很明顯, 他們甚至?xí)峁﹥商讓?shí)現(xiàn),一個(gè)主要用于在無(wú)法編譯的環(huán)境下使用,而在合適的環(huán)境則使用C實(shí)現(xiàn)的原生擴(kuò)展, 這樣在效率和可移植性上都可以保證。目前這些為PHP編寫的擴(kuò)展通常都無(wú)法在其他的PHP實(shí)現(xiàn)中實(shí)現(xiàn)重用, HipHop的做法是對(duì)最為流行的擴(kuò)展進(jìn)行重寫。如果PHP擴(kuò)展能和ZendAPI解耦,則在其他語(yǔ)言中重用這些擴(kuò)展也將更加容易了。
相關(guān)文章:
1. php測(cè)試程序運(yùn)行速度和頁(yè)面執(zhí)行速度的代碼2. ASP中常用的22個(gè)FSO文件操作函數(shù)整理3. 三個(gè)不常見的 HTML5 實(shí)用新特性簡(jiǎn)介4. Warning: require(): open_basedir restriction in effect,目錄配置open_basedir報(bào)錯(cuò)問(wèn)題分析5. ASP調(diào)用WebService轉(zhuǎn)化成JSON數(shù)據(jù),附j(luò)son.min.asp6. SharePoint Server 2019新特性介紹7. React+umi+typeScript創(chuàng)建項(xiàng)目的過(guò)程8. 無(wú)線標(biāo)記語(yǔ)言(WML)基礎(chǔ)之WMLScript 基礎(chǔ)第1/2頁(yè)9. ASP.NET Core 5.0中的Host.CreateDefaultBuilder執(zhí)行過(guò)程解析10. php網(wǎng)絡(luò)安全中命令執(zhí)行漏洞的產(chǎn)生及本質(zhì)探究
