Zend引擎
簡介
The Zend Engine is the open source scripting engine that interprets the PHP programming language.
Zend引擎是開源的解釋php語言的腳本引擎。
Zend有兩部分組成,即編譯器和執行器。編譯器負責將PHP代碼編譯為抽象語法樹,然後進一步編譯為可執行的opcodes,這個過程相當於GCC的工作,編譯器是一個語言實現的基礎;執行器負責執行編譯器輸出的Opcodes,也就是執行PHP腳本中編寫的代碼邏輯。 Opcode是將PHP代碼編譯產生的Zend虛擬機可識別的指令,php7共有173個Opcode,定義在zend_vm_opcodes.h中,PHP中的所有語法實現都是由這些opcode組成的。
Zend Engine最主要的特性就是把PHP的邊解釋邊執行的運行方式改為先進行預編譯(Compile),然後再執行(Execute)
詳細原理
見鏈接3(我沒看完,不太懂,還是太年輕啊~~)。
優缺點
- 執行效率大幅提升
- 降低解耦,可擴展增強
- Zend Engine 將代碼分成編譯和執行兩大部分。一般情況下,我們的代碼完成以後就很少再去改變了。但執行時PHP卻不得不重新編譯,耗時並且浪費資源。(所以才有Opcache呀~)
Opcode
Opcode是一種PHP腳本編譯後的中間語言,就像Java的ByteCode,或者.NET的MSL。PHP執行代碼會經過如下4個步驟(確切的來說,應該是PHP的語言引擎Zend):
1.Scanning(Lexing) ,將PHP代碼轉換為語言片段(Tokens)
4.Execution, 順次執行Opcodes,每次一條,從而實現PHP腳本的功能。
現在有的Cache比如APC、Opcache(APC止步於PHP 5.4,Zend Opcache從PHP 5.5 開始集成,取代APC。),可以使得PHP緩存住Opcodes,這樣,每次有請求來臨的時候,就不需要重複執行前面3步,從而能大幅的提高PHP的執行速度。 如下圖:
小插曲
有一次線上發代碼了(修改了資料庫),但是資料庫裡面數據沒進來,非常詭異,懷疑是代碼沒有發成功,後來leader在群里對運維說Opcache(原理就是緩存Opcodes)沒有更新。。。小坑小坑
參考
- http://www.careerride.com/PHP-zend-engine.aspx
- https://www.kancloud.cn/nickbai/php7/363257
- https://github.com/pangudashu/php7-internal/blob/master/3/zend_executor.md
- http://www.nowamagic.net/librarys/veda/detail/1291
- https://www.cnblogs.com/JohnABC/p/4531029.html
- http://www.laruence.com/2008/06/18/221.html
推薦閱讀:
※wordpress 代碼質量怎麼樣?
※Apache是否優於Nginx?
※因不知道Reservoir Sampling演算法而掛掉面試的我是否要檢討自己?
※php如何不修改一句業務代碼實現整庫數據變化實時監控?
※如何反駁服務端程序員聲稱SELECT出來的數據直接丟給客戶端的代碼最好?