本文基於《PHP 內核剖析》與 《PHP7底層設計與源碼實現》所記筆記。 對PHP內核的深入理解有助於我們對PHP的整體認識,對於業務層初期發展我們可以只了解基本語言的邏輯就可以寫出符合業務的代碼,但是隨著業務的發展我們通過分析源碼,編寫擴展,深入了解PHP內部機制,幫助我們理解PHP內部實現邏輯,更好助力業務發展.
執行流程
解析為Token
將語法轉換為抽象語法樹
將語法樹轉換Opcodes
Scanning
Parsing
Compilation
Excution:執行Opcodes
從上圖中看出主要從解析PHPCode到執行主要經過了四個階段.
獲取token可以通過
Token_get_all('<?php echo "str";>')
函數獲取token信息.
抽象語法樹主要將解釋器和編譯器進行解耦.
opcodes最終執行的指令,例如ZEND_ECHO:本質還是一個對應的C函數.
架構結構
Zend層為上層的PHP層提供一些基礎的內存管理以及數據結構等.
SAPI層為最上層和Server進行通信,封裝了不同的通信類型,cgi,fast-cgi,cli等.
目錄結構
sapi
存放根據不同環境支持的上層API交互形式,實現了不同的輸入輸出形式.
Zend
存放PHP相關的核心代碼,如前所述內存管理等.
main
負責與Zend層交互的入口,還有一些鉤子函數.
ext
主要是擴展相關的目錄.通過
ext_skel
命令生成自定的模塊.會默認安裝到這個目錄.
TSRM
線程資源管理相關的目錄,一般只有和Apache結合使用時會涉及到線程資源管理相關的代碼. 與Nginx相關的一般只會用到FastCGI協議不涉及到TSRM模塊.