PHP7內核剖析讀書筆記-PHP基礎架構

PHP7的變化(相對於PHP5)

php7比php5運行速度更快。比PHP5快了將近5倍,同時降低了PHP對系統資源的佔用。

  1. 抽象語法樹

之前的PHP版本中,php代碼在語法解析階段直接生成了ZendVM指令,這使得編譯器與執行器耦合在一起。這使得如果要把執行引擎換成別的,就需要修改語法解析規則。反之,如果語法規則變了,但是執行指令沒有變化,也需要修改語法解析規則。
php7中增加抽象語法樹,首先將PHP代碼解析生成抽象語法樹,然後將抽象語法樹編譯爲ZendVM指令。編譯器不需要關心指令的生成規則,執行器根據自己的規則將抽象語法書編譯爲對應的指令,執行器不需要關心該指令的語法規則。

  1. 線程局部存儲

PHP5爲了保護線程安全,通過參數將線程資源池傳遞給其餘函數。
PHP7則是是用Native TLS(線程局部存儲)來保存線程的資源池。

  1. 指定函數參數,返回值類型

PHP7可以指定函數參數及返回值的類型。

  1. zval結構變化

zval是PHP一個很重要的結構,是PHP變量的內部結構。
PHP7將引用計數從zval中移入到具體的value中,這樣子更爲合理,zval只是具體value的載體。這樣子使得PHP變量之間的複製,傳遞更加簡潔,易懂。除此之外,zval大小也從24字節減少到了16字節,這是PHP7相對於PHP5降低系統資源的一個優化點。

  1. 異常處理

PHP5的很多操作會直接拋出error,比如數組中沒有索引會拋error,PHP7則將很多錯誤改爲了異常拋出,這樣子可以通過try catch捕獲。

  1. HashTable

PHP7中HashTable結構的大小從72字節減少到56字節,同時,數組元素Bucket結構也從72字節減少到了32字節

  1. 執行器

execute_data、opline採用寄存器變量存儲。在PHP5中,這兩個變量是由execute_ex()通過參數傳遞給各指令handler的。PHP7中不是採用傳參的方式,而是將execute_data,opline通過寄存器進行存儲,避免了傳參導致的頻繁出入棧。寄存器比內存更快,所以PHP7比PHP5性能更優。

  1. 新的參數解析方式

PHP5中國zend_parse_parameters()解析函數的參數,PHP7提供了另一種更爲合理的方式,並且保留了原有的方式。

PHP的構成

PHP源碼主要有幾個目錄:SAPI,main,Zend,ext。
SAPI:PHP應用接口層

PHP是一個腳本解釋器,提供腳本的解析和執行。我們可以在不同的環境中應用這個解析器,SAPI就是爲了適配不同應用環境的。SAPI可以認爲爲PHP最外層的部分,主要負責PHP框架初始化的部分。常見的SAPI有cli和fpm。

main:PHP的主要代碼
Zend:是PHP解析器的主要實現,即zendVM

zendVM是PHP的核心實現,它主要由兩部門組成:編譯器,執行器。編譯器負責將代碼解釋爲執行器可以識別的指令,執行器負責執行編譯器解釋出的指令。

ext:Extension是PHP內核提供的一套用於擴充PHP功能的一種方式。

生命週期

PHP的生命週期被劃分爲以下幾個階段:模塊初始化階段,請求初始化階段,執行腳本階段,請求關閉階段,模塊關閉階段。
cli模式下,5個階段都會走完。
fpm下,則只會走到請求關閉階段。
1.模塊初始化階段:這個階段主要進行PHP框架,zend引擎的初始化操作。
2.請求初始化階段:對於fpm而言,是在worker進程accept一個請求且讀取,解析完請求數據後的一個階段。
3.執行腳本階段:包括代碼的編譯,執行兩個階段。在編譯階段,PHP腳本經理從源代碼到抽象語法樹再到opline。接着opline指令被執行器執行。
4.請求關閉階段:在PHP腳本解釋執行完成後將進入請求關閉階段,這個階段將flush輸出內容,發送HTTP應答header頭,清理全局變量,關閉編譯器,關閉執行器等。
5.模塊關閉階段:此模塊主要進行資源清理,PHP各模塊的關閉操作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章