上篇文章咱們已經介紹了源碼分析工具的安裝、配置以及調試方法,本文咱們來說述一下PHP源碼的目錄結構。php
以php-7.0.12
爲例,看過源碼的同窗們應該發現源碼目錄多達十多個,下面是每一個目錄的說明。linux
目錄 | 說明 |
---|---|
TSRM | 線程相關安全的實現 |
Zend | PHP解析器的核心實現 |
build | linux下編譯相關的目錄 |
ext | PHP的擴展 |
main | PHP的主要代碼 |
netware | 網絡目錄,socket的定義與實現 |
pear | PHP擴展及應用的代碼倉庫 |
sapi | PHP的應用層接口 |
scripts | Linux下的腳本目錄 |
tests | 測試腳本目錄 |
travis | 用於構建,非PHP特有目錄 |
win32 | Windows下編譯PHP的相關腳本 |
雖然源碼目錄衆多,可是核心目錄卻只有sapi、main、zend、ext、TSRM
。apache
還記得PHP的應用場景嗎?咱們能夠在命令行中訪問PHP,也能夠經過瀏覽器訪問PHP腳本,甚至能夠嵌入到單片機供C、C++程序調用。它們分別對應cli模式、fpm/cgi模式、embed模式,除了這些還有apache2handler、litespeed模式。
json
SAPI全稱Server API,負責PHP對外提供服務規範,它定義告終構體sapi_module_struct
,該結構體定義了模式啓動、關閉、激活、失效等多個鉤子函數指針,每一個模式將這些函數指針指向本身的函數,就能夠輕鬆擴展PHP對外服務的方式。以上幾種模式也正是實現了sapi_module_strcut
才完成了PHP的多場景應用。api
main目錄的做用是承接SAPI的請求,分析出要執行的腳本文件和參數,並對環境和配置進行初始化,好比初始化變量和常量、註冊函數、解析配置文件、加載擴展等等。
瀏覽器
Zend目錄就是你們所熟知的Zend引擎,是PHP最核心的部分,主要負責PHP的語法實現、內存管理及腳本的編譯運行環境等,它由編譯器、執行器兩部分組成。安全
編譯器負責將PHP代碼進行詞法、語法分析,並生成抽象語法樹,而後進一步編譯爲opcode,opcode是Zend虛擬機可識別的指令,php7一共有173個opcode,全部的語法都是由這些opcode組成的。執行器負責執行編譯器輸出的opcode。網絡
ext是extension的縮寫,它是擴展PHP內核功能的一種方式,分爲PHP擴展與zend擴展,都支持用戶自定義開發,這兩種都比較常見,PHP擴展有gd、json、date、array等,而咱們熟知的opcache就是Zend擴展。php7
TSRM全稱叫作Thread Safe Resource Manager,也就是線程安全資源管理器。多線程
咱們知道,全局變量就是定義在函數外的變量,它屬於公共資源,在多線程的環境下,訪問公共資源就可能會引發衝突,TSRM就是爲解決該問題而誕生的。它爲每一個線程分配一個獨立的自增ID,該ID做爲當前線程的全局變量內存區的索引,從而實現線程的徹底獨立。
其實PHP大部分SAPI都是單線程的,因此並不須要過多關注線程安全,可是在Apache或者用戶本身實現的PHP環境下,就須要考慮線程安全問題了。