php是一門適用於web開發的動態語言,它可以說是一個用C語言實現的包含大量組件的軟件框架。那么,php是如何工作的呢?它的生命周期是怎么樣的呢?
目錄
表層分析
php是以請求/響應為周期運行服務端應用程序,當請求進入應用程序,流程如下:
php的每一個請求都會重復以上的交互。
底層分析
php的運行模式有兩種:web模式和cli模式。無論是哪種公眾模式,php的工作原理都是一樣的,都是作為一種SAPI運行。首先,認識下SAPI,它是什么?
Sapi全稱是Server Application Programming Interface,也就是服務端應用編程接口,Sapi通過一系列鈎子函數,使得PHP可以和外圍交互數據,這是PHP非常優雅和成功的一個設計,通過sapi成功的將PHP本身和上層應用解耦隔離,PHP可以不再考慮如何針對不同應用進行兼容,而應用本身也可以針對自己的特點實現不同的處理方式。
常見的SAPI有cli、cgi、php-fpm以及各服務具體的sapi。
在php的生命周期中,有4個關鍵調用:
SAPI運行PHP都經過下面幾個階段:
1、模塊初始化階段(module init):
這個階段主要進行php框架、zend引擎的初始化操作。這個階段一般是在SAPI啟動時執行一次,對於FPM而言,就是在fpm的master進行啟動時執行的。php加載每個擴展的代碼並調用其模塊初始化例程(MINIT),進行一些模塊所需變量的申請,內存分配等。
2、請求初始化階段(request init):
當一個頁面請求發生時,在請求處理前都會經歷的一個階段。對於fpm而言,是在worker進程accept一個請求並讀取、解析完請求數據后的一個階段。在這個階段內,SAPI層將控制權交給PHP層,PHP初始化本次請求執行腳本所需的環境變量。
3、php腳本執行階段
php代碼解析執行的過程。Zend引擎接管控制權,將php腳本代碼編譯成opcodes並順次執行
4、請求結束階段(request shutdown):
請求處理完后就進入了結束階段,PHP就會啟動清理程序。這個階段,將flush輸出內容、發送http響應內容等,然后它會按順序調用各個模塊的RSHUTDOWN方法。 RSHUTDOWN用以清除程序運行時產生的符號表,也就是對每個變量調用unset函數。
5、模塊關閉階段(module shutdown):
該階段在SAPI關閉時執行,與模塊初始化階段對應,這個階段主要是進行資源的清理、php各模塊的關閉操作,同時,將回調各擴展的module shutdown鈎子函數。這是發生在所有請求都已經結束之后,例如關閉fpm的操作。(這個是對於CGI和CLI等SAPI,沒有“下一個請求”,所以SAPI立刻開始關閉。)
PHP的核心架構圖
截圖於:PHP底層的運行機制與原理