PHP的執行分三個階段:
處理請求的開始階段、處理請求階段、請求之后的結束階段。
處理請求的開始階段:
1模塊初始化階段(MINIT),在整個SAPI生命周期內(例如Apache啟動以后的整個生命周期內或者命令行程序整個執行過程中),該過程只進行一次。(這應該就是為何修改了php.ini之后,要重啟Apache的原因);
PHP_MINIT_FUNCTION(extension_name){
/*Initializefunctions,classesetc*/
}
2請求初始化階段(RINIT),該過程發生在請求階段,例如通過url請求某個頁面,則在每次請求之前都會進行模塊激活。(為何不先激活呢?因為方便模塊在RINIT階段針對各種請求設置環境變量或其他的操作);
PHP_RINIT_FUNCTION(extension_name){
/*Initializesessionvariables,pre-populatevariables,redefineglobalvariablesetc*/
}
處理請求階段:
1詞法分析:將php文件翻譯成一個個的token;
2語法分析:根據生成的token和語法規則進行分析;
3Zend引擎:將代碼編譯為opcode后并執行,在執行的過程中還會重復進行編譯-執行,例如執行了include語句(為何不在第一次編譯就把這些包含進來的文件也一起編譯好?);
4調用SAPI的輸出函數返回執行結果。
處理請求的結束階段:
1關閉請求:RSHUTDOWN對應于RINIT,釋放資源等操作
2關閉模塊:MSHUTDOWN對應于MINIT,SAPI生命周期結束(Web服務器退出或者命令行腳本執行完畢退出)
PHP_RSHUTDOWN_FUNCTION(extension_name){
/*Domemorymanagement,unsetallvariablesusedinthelastPHPcalletc*/
}
PHP_MSHUTDOWN_FUNCTION(extension_name){
/*Freehandlersandpersistentmemoryetc*/
}