標籤:

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)

2.Parsing, 將Tokens轉換成簡單而有意義的表達式

3.Compilation, 將表達式編譯成Opocdes

4.Execution, 順次執行Opcodes,每次一條,從而實現PHP腳本的功能。

現在有的Cache比如APC、Opcache(APC止步於PHP 5.4,Zend Opcache從PHP 5.5 開始集成,取代APC。),可以使得PHP緩存住Opcodes,這樣,每次有請求來臨的時候,就不需要重複執行前面3步,從而能大幅的提高PHP的執行速度。 如下圖:

小插曲

有一次線上發代碼了(修改了資料庫),但是資料庫裡面數據沒進來,非常詭異,懷疑是代碼沒有發成功,後來leader在群里對運維說Opcache(原理就是緩存Opcodes)沒有更新。。。小坑小坑

參考

  1. careerride.com/PHP-zend
  2. kancloud.cn/nickbai/php
  3. github.com/pangudashu/p
  4. nowamagic.net/librarys/
  5. cnblogs.com/JohnABC/p/4
  6. laruence.com/2008/06/18

推薦閱讀:

wordpress 代碼質量怎麼樣?
Apache是否優於Nginx?
因不知道Reservoir Sampling演算法而掛掉面試的我是否要檢討自己?
php如何不修改一句業務代碼實現整庫數據變化實時監控?
如何反駁服務端程序員聲稱SELECT出來的數據直接丟給客戶端的代碼最好?

TAG:PHP | PHP編程 |