跟廠長學PHP7內核(三):源碼目錄結構

上篇文章咱們已經介紹了源碼分析工具的安裝、配置以及調試方法,本文咱們來說述一下PHP源碼的目錄結構。php

1、目錄概覽

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的相關腳本

2、核心目錄

雖然源碼目錄衆多,可是核心目錄卻只有sapi、main、zend、ext、TSRMapache

2.一、SAPI

還記得PHP的應用場景嗎?咱們能夠在命令行中訪問PHP,也能夠經過瀏覽器訪問PHP腳本,甚至能夠嵌入到單片機供C、C++程序調用。它們分別對應cli模式、fpm/cgi模式、embed模式,除了這些還有apache2handler、litespeed模式。
imagejson

SAPI全稱Server API,負責PHP對外提供服務規範,它定義告終構體sapi_module_struct,該結構體定義了模式啓動、關閉、激活、失效等多個鉤子函數指針,每一個模式將這些函數指針指向本身的函數,就能夠輕鬆擴展PHP對外服務的方式。以上幾種模式也正是實現了sapi_module_strcut才完成了PHP的多場景應用。api

2.二、main

main目錄的做用是承接SAPI的請求,分析出要執行的腳本文件和參數,並對環境和配置進行初始化,好比初始化變量和常量、註冊函數、解析配置文件、加載擴展等等。
image瀏覽器

2.三、Zend

Zend目錄就是你們所熟知的Zend引擎,是PHP最核心的部分,主要負責PHP的語法實現、內存管理及腳本的編譯運行環境等,它由編譯器、執行器兩部分組成。安全

編譯器負責將PHP代碼進行詞法、語法分析,並生成抽象語法樹,而後進一步編譯爲opcode,opcode是Zend虛擬機可識別的指令,php7一共有173個opcode,全部的語法都是由這些opcode組成的。執行器負責執行編譯器輸出的opcode。網絡

image

2.四、ext

ext是extension的縮寫,它是擴展PHP內核功能的一種方式,分爲PHP擴展與zend擴展,都支持用戶自定義開發,這兩種都比較常見,PHP擴展有gd、json、date、array等,而咱們熟知的opcache就是Zend擴展。php7

image

2.五、TSRM

TSRM全稱叫作Thread Safe Resource Manager,也就是線程安全資源管理器。多線程

咱們知道,全局變量就是定義在函數外的變量,它屬於公共資源,在多線程的環境下,訪問公共資源就可能會引發衝突,TSRM就是爲解決該問題而誕生的。它爲每一個線程分配一個獨立的自增ID,該ID做爲當前線程的全局變量內存區的索引,從而實現線程的徹底獨立。

其實PHP大部分SAPI都是單線程的,因此並不須要過多關注線程安全,可是在Apache或者用戶本身實現的PHP環境下,就須要考慮線程安全問題了。

相關文章
相關標籤/搜索