php是一門適用于web開發(fā)的動(dòng)態(tài)語言,它可以說是一個(gè)用C語言實(shí)現(xiàn)的包含大量組件的軟件框架。那么,php是如何工作的呢?它的生命周期是怎么樣的呢?
表層分析
php是以請(qǐng)求/響應(yīng)為周期運(yùn)行服務(wù)端應(yīng)用程序,當(dāng)請(qǐng)求進(jìn)入應(yīng)用程序,流程如下:
php的每一個(gè)請(qǐng)求都會(huì)重復(fù)以上的交互。
底層分析
php的運(yùn)行模式有兩種:web模式和cli模式。無論是哪種公眾模式,php的工作原理都是一樣的,都是作為一種SAPI運(yùn)行。首先,認(rèn)識(shí)下SAPI,它是什么?
Sapi全稱是Server Application Programming Interface,也就是服務(wù)端應(yīng)用編程接口,Sapi通過一系列鉤子函數(shù),使得PHP可以和外圍交互數(shù)據(jù),這是PHP非常優(yōu)雅和成功的一個(gè)設(shè)計(jì),通過sapi成功的將PHP本身和上層應(yīng)用 解耦隔離,PHP可以不再考慮如何針對(duì)不同應(yīng)用進(jìn)行兼容,而應(yīng)用本身也可以針對(duì)自己的特點(diǎn)實(shí)現(xiàn)不同的處理方式。
常見的SAPI有cli、cgi、php-fpm以及各服務(wù)具體的sapi。
在php的生命周期中,有4個(gè)關(guān)鍵調(diào)用:
以nginx服務(wù)器為例,在web模式下,生命周期流程如下:
SAPI運(yùn)行PHP都經(jīng)過下面幾個(gè)階段:
1、模塊初始化階段(module init):
這個(gè)階段主要進(jìn)行php框架、zend引擎的初始化操作。這個(gè)階段一般是在SAPI啟動(dòng)時(shí)執(zhí)行一次,對(duì)于FPM而言,就是在fpm的master進(jìn)行啟動(dòng)時(shí)執(zhí)行的。php加載每個(gè)擴(kuò)展的代碼并調(diào)用其模塊初始化例程(MINIT),進(jìn)行一些模塊所需變量的申請(qǐng),內(nèi)存分配等。
2、請(qǐng)求初始化階段(request init):
當(dāng)一個(gè)頁面請(qǐng)求發(fā)生時(shí),在請(qǐng)求處理前都會(huì)經(jīng)歷的一個(gè)階段。對(duì)于fpm而言,是在worker進(jìn)程accept一個(gè)請(qǐng)求并讀取、解析完請(qǐng)求數(shù)據(jù)后的一個(gè)階段。在這個(gè)階段內(nèi),SAPI層將控制權(quán)交給PHP層,PHP初始化本次請(qǐng)求執(zhí)行腳本所需的環(huán)境變量。
3、php腳本執(zhí)行階段
php代碼解析執(zhí)行的過程。Zend引擎接管控制權(quán),將php腳本代碼編譯成opcodes并順次執(zhí)行
4、請(qǐng)求結(jié)束階段(request shutdown):
請(qǐng)求處理完后就進(jìn)入了結(jié)束階段,PHP就會(huì)啟動(dòng)清理程序。這個(gè)階段,將flush輸出內(nèi)容、發(fā)送http響應(yīng)內(nèi)容等,然后它會(huì)按順序調(diào)用各個(gè)模塊的RSHUTDOWN方法。 RSHUTDOWN用以清除程序運(yùn)行時(shí)產(chǎn)生的符號(hào)表,也就是對(duì)每個(gè)變量調(diào)用unset函數(shù)。
5、模塊關(guān)閉階段(module shutdown):
該階段在SAPI關(guān)閉時(shí)執(zhí)行,與模塊初始化階段對(duì)應(yīng),這個(gè)階段主要是進(jìn)行資源的清理、php各模塊的關(guān)閉操作,同時(shí),將回調(diào)各擴(kuò)展的module shutdown鉤子函數(shù)。這是發(fā)生在所有請(qǐng)求都已經(jīng)結(jié)束之后,例如關(guān)閉fpm的操作。(這個(gè)是對(duì)于CGI和CLI等SAPI,沒有“下一個(gè)請(qǐng)求”,所以SAPI立刻開始關(guān)閉。)
PHP的核心架構(gòu)圖
掃碼二維碼 獲取免費(fèi)視頻學(xué)習(xí)資料
- 本文固定鏈接: http://www.wangchenghua.com/post/7352/
- 轉(zhuǎn)載請(qǐng)注明:轉(zhuǎn)載必須在正文中標(biāo)注并保留原文鏈接
- 掃碼: 掃上方二維碼獲取免費(fèi)視頻資料