Zend引擎

簡介

The Zend Engine is the open source scripting engine that interprets the PHP programming language.
複製代碼

Zend引擎是開源的解釋php語言的腳本引擎。php

PHP執行示意圖

Zend有兩部分組成,即編譯器和執行器。編譯器負責將PHP代碼編譯爲抽象語法樹,而後進一步編譯爲可執行的opcodes,這個過程至關於GCC的工做,編譯器是一個語言實現的基礎;執行器負責執行編譯器輸出的Opcodes,也就是執行PHP腳本中編寫的代碼邏輯。 Opcode是將PHP代碼編譯產生的Zend虛擬機可識別的指令,php7共有173個Opcode,定義在zend_vm_opcodes.h中,PHP中的全部語法實現都是由這些opcode組成的。html

Zend Engine最主要的特性就是把PHP的邊解釋邊執行的運行方式改成先進行預編譯(Compile),而後再執行(Execute)
複製代碼

詳細原理

見連接3(我沒看完,不太懂,仍是太年輕啊~~)。git

優缺點

  • 執行效率大幅提高
  • 下降解耦,可擴展加強
  • Zend Engine 將代碼分紅編譯和執行兩大部分。通常狀況下,咱們的代碼完成之後就不多再去改變了。但執行時PHP卻不得不從新編譯,耗時而且浪費資源。(因此纔有Opcache呀~)

Opcode

Opcode是一種PHP腳本編譯後的中間語言,就像Java的ByteCode,或者.NET的MSL。PHP執行代碼會通過以下4個步驟(確切的來講,應該是PHP的語言引擎Zend):github

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的執行速度。 以下圖:數據庫

https://user-gold-cdn.xitu.io/2018/2/22/161bbf47aa4136ad?w=838&h=306&f=png&s=21396

小插曲

有一次線上發代碼了(修改了數據庫),可是數據庫裏面數據沒進來,很是詭異,懷疑是代碼沒有發成功,後來leader在羣裏對運維說Opcache(原理就是緩存Opcodes)沒有更新。。。小坑小坑緩存

參考

  1. www.careerride.com/PHP-zend-en…
  2. www.kancloud.cn/nickbai/php…
  3. github.com/pangudashu/…
  4. www.nowamagic.net/librarys/ve…
  5. www.cnblogs.com/JohnABC/p/4…
  6. www.laruence.com/2008/06/18/…
相關文章
相關標籤/搜索