本篇文章主要介紹php生命週期,瞭解PHP生命週期之前,需要先瞭解一下apache是怎麼和php關聯,感興趣的朋友參考下,希望對大家有所協助。
1.Apache運行機制剖析
-----------------------------
總體如下:
Apache Hook機制 Apache的Hook機制是指:Apache 允許模組(包括內部模組和外部模組,例如mod_php5.so,mod_perl.so等)將自訂的函數注入到請求處理迴圈中。換句話說,模組可以在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指令碼的執行環境。
執行PHP指令碼(這一步,應該是大多數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函數。
PHP_RSHUTDOWN_FUNCTION(extension_name) {/* Do memory management, unset all variables used in the last PHP call etc */}
2.3.2 SAPI生命週期結束時(MSHUTDOWN)
最後,所有的請求都已處理完畢
SAPI也準備關閉了
PHP調用每個擴充的MSHUTDOWN方法
這時各個模組最後一次釋放記憶體的機會。
(這個是對於CGI和CLI等SAPI,沒有“下一個請求”,所以SAPI立刻開始關閉。)
PHP_MSHUTDOWN_FUNCTION(extension_name) {/* Free handlers and persistent memory etc */}
整個PHP生命週期就結束了。要注意的是,只有在伺服器沒有請求的情況下才會執行“啟動第一步”和“關閉第二步”。
相關推薦:
thinkPHP5.0架構應用請求生命週期分析
vue組件生命週期使用方法
React Native組件的生命週期多長