了解PHP生命周期之前,先了解一下apache是怎么和php關聯起來的吧~
1.Apache運行機制剖析


-----------------------------





總體示意圖如下:


Apache Hook機制 Apache的Hook機制是指:Apache 允許模塊(包括內部模塊和外部模塊, mod_php5.so/ php5apache2.dll就是將所包含的自定義函數,通過Hook機制注入到Apache中,在Apache處理流程的各個階段負責處理php請求。
知道了apache是怎么hook到php的,那么下邊看看apache轉接到PHP后的一個流程邏輯。
2.PHP運行流程圖解
PHP開始和結束階段
PHP開始執行以后會經過兩個主要的階段:處理請求之前的開始階段和請求之后的結束階段。


2.1 SAPI運行PHP都經過的幾個階段
- 模塊初始化階段(Module init)
即調用每個拓展源碼中的的PHP_MINIT_FUNCTION中的方法初始化模塊,進行一些模塊所需變量的申請,內存分配等。
- 請求初始化階段(Request init)
即接受到客戶端的請求后調用每個拓展的PHP_RINIT_FUNCTION中的方法,初始化PHP腳本的執行環境。
- 請求結束(Request Shutdown)
這時候調用每個拓展的PHP_RSHUTDOWN_FUNCTION方法清理請求現場,並且ZE開始回收變量和內存
- 關閉模塊(Module shutdown)
Web服務器退出或者命令行腳本執行完畢退出會調用拓展源碼中的PHP_MSHUTDOWN_FUNCTION 方法
經過如下幾個環節: 開始 - 請求開始 - 請求關閉 - 結束 SAPI接口實現就完成了其生命周期
2.2開始階段
2.2.1模塊初始化階段MINIT
在整個SAPI生命周期內(例如Apache啟動以后的整個生命周期內或者命令行程序整個執行過程中),
該過程只進行一次。
啟動Apache后,PHP解釋程序也隨之啟動;
PHP調用各個擴展(模塊)的MINIT方法,從而使這些擴展切換到可用狀態。
//這也是為什么引入了新dll模塊,得重啟apache的原因。php.ini
PHP_MINIT_FUNCTION(myphpextension) { // 注冊常量或者類等初始化操作 return SUCCESS; }


2.2.2模塊激活階段RINIT
該過程發生在請求階段,
例如通過url請求某個頁面,則在每次請求之前都會進行模塊激活(RINIT請求開始)。
請求到達之后,SAPI層將控制權交給PHP層,PHP初始化本次請求執行腳本所需的環境變量
例如是Session模塊的RINIT,如果在php.ini中啟用了Session 模塊,那在調用該模塊的RINIT時就會初始化$_SESSION變量,並將相關內容讀入; 然后PHP會調用所有模塊RINIT函數,即“請求初始化”。
在這個階段各個模塊也可以執行一些相關的操作, 模塊的RINIT函數和MINIT函數類似 ,
RINIT方法可以看作是一個准備過程,在程序執行之前就會自動啟動。
PHP_RINIT_FUNCTION(extension_name) { /* Initialize session variables, pre-populate variables, redefine global variables etc */ }


2.3結束階段
請求處理完后就進入了結束階段, 一般腳本執行到末尾或者通過調用exit()或者die()函數,PHP都將進入結束階段. 和開始階段對應,結束階段也分為兩個環節,一個在請求結束后(RSHUWDOWN),一個在SAPI生命周期結束時(MSHUTDOWN).、
2.3.1請求結束后(RSHUWDOWN)
請求處理完后就進入了結束階段,PHP就會啟動清理程序。
它會按順序調用各個模塊的RSHUTDOWN方法。
RSHUTDOWN用以清除程序運行時產生的符號表,
也就是對每個變量調用unset函數。


2.3.2 SAPI生命周期結束時(MSHUTDOWN)
最后,所有的請求都已處理完畢
SAPI也准備關閉了
PHP調用每個擴展的MSHUTDOWN方法
這時各個模塊最后一次釋放內存的機會。
(這個是對於CGI和CLI等SAPI,沒有“下一個請求”,所以SAPI立刻開始關閉。)
PHP_MSHUTDOWN_FUNCTION(extension_name) { /* Free handlers and persistent memory etc */ }


整個PHP生命周期就結束了。要注意的是,只有在服務器沒有請求的情況下才會執行“啟動第一步”和“關閉第二步”。
轉自:http://m.blog.csdn.net/article/details?id=52877759