以PHP7爲學習基礎,PHP7的源碼爲C編寫的。
參考書籍:《PHP內核剖析》秦鵬/著
GitHub網頁:https://github.com/pangudashu/php7-internal
目錄
1.1 簡介
PHP是一種非常流行的高級腳本語言,尤其適合web開發,快速、靈活和實用是PHP最重要的特點。
PHP獨特的語法混合了C、Java、Perl及PHP自創新的語法,同時支持面向對象、面向過程,相比於前面的語言,PHP具有語法簡潔、使用靈活、開發效率高、容易學習等特點。具體特點如下:
●開源免費:PHP社區有大量的活躍開發者貢獻代碼;
●快捷:程序開發庫,運行快,技術本身學習快,實用性強;
●效率高:PHP消耗相當少的系統資源,自動gc機制;
●類庫資源:有大量可用類庫供開發者使用;
●擴展性:允許用戶使用C/C++擴展PHP;
●跨平臺:可以在UNIX、Windows、Mac OS等系統上使用PHP。
個人可開發的點在於類庫資源與擴展性,這樣能使用很多完整的功能模塊,並能根據自身需求擴展開發。
1.2 PHP的構成
源碼下有幾個主要的目錄:SAPI、main、Zend、ext。
具體過程是:瀏覽器<--->SAPI<--->main<--->Zend,Zend在解析的過程中會加載ext擴展
●SAPI是PHP的應用接口層,爲了適配不同的應用環境,是整個PHP框架最外層的一部分。最常用的SAPI是Cli與Fpm;
●main爲PHP的主要代碼,主要是輸入/輸出、web通信,以及PHP框架的初始化操作等,如fastcgi協議的解析(CGI全稱是“通用網關接口”(Common Gateway Interface),HTTP服務器與你的或其它機器上的程序進行“交談”的一種工具,其程序一般運行在網絡服務器上)、擴展的加載、PHP配置解析等工作,位於ZendVM的上一層;
●Zend目錄是PHP解析器的主要實現,即ZendVM; PHP的代碼解析、執行就是靠Zend完成;包括編譯器與執行器,將PHP的代碼解析爲執行器可識別的指令,等價於Java的JVM,都是抽象出來的虛擬計算機,與C/C++不同的是,虛擬機運行的指令不是機器指令。虛擬機的優勢是可以跨平臺,只需要按照不同平臺編譯出對應的解析器就能實現代碼的跨平臺執行;
●ext是PHP的擴展目錄,PHP中很多操作函數都是通過擴展提供的。通過擴展,我們可以用C/C++實現更強大的功能與性能。擴展分爲PHP擴展與Zend擴展,Opcache是Zend擴展;
●TSRM是線程安全相關實現。
1.3 生命週期
PHP生命週期被劃分爲:模塊初始化階段(module startup)、請求初始化階段(request startup)、執行腳本階段(execute script)、請求關閉階段(request shutdown)、模塊關閉階段(module shutdown)。
1、模塊初始化階段
這個階段主要進行PHP框架、Zend框架的初始化操作。此函數定義在main.c中。
通過上圖我們可以明顯發現這個php_module_startup是在SAPI執行時啓動的,對於FPM而言,就是在master進程啓動時執行的。具體執行的操作如圖1。擴展的鉤子函數就是在這個階段調用的。
2、請求初始化階段
該階段在請求處理前每一個請求都會經歷的一個階段,對於fpm而言,是在worker進程accept一個請求且讀取、解析完請求數據後的一個階段。php_request_startup主要過程如圖:
3、執行腳本階段
該階段包括PHP代碼的編譯、執行兩個核心階段。具體過程如圖:
4、請求關閉階段
PHP解析執行後進入請求關閉階段,這個階段將flush輸出內容、發送HTTP應答頭、清理全局變量、關閉編譯器與執行器等。在該階段回調各擴展的request shutdown鉤子函數。該階段是請求初始化的相反操作。
5、模塊關閉階段
該階段在SAPI關閉時執行,與模塊初始化階段對應,這個階段主要進行資源的清理、PHP各模塊的關閉,同時,回調各擴展的module shutdown鉤子函數。具體操作函數爲php_module_shutdown()。