PHP生命週期解析

來源:互聯網
上載者:User
本篇文章主要介紹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都經過的幾個階段

  1. 模組初始化階段(Module init)

即調用每個拓展源碼中的的PHP_MINIT_FUNCTION中的方法初始化模組,進行一些模組所需變數的申請,記憶體配置等。

  1. 請求初始化階段(Request init)

即接受到用戶端的請求後調用每個拓展的PHP_RINIT_FUNCTION中的方法,初始化PHP指令碼的執行環境。

  1. 執行PHP指令碼(這一步,應該是大多數PHP程式員所熟悉的部分,自己寫的代碼就是在這裡執行的)

  2. 請求結束(Request Shutdown)

這時候調用每個拓展的PHP_RSHUTDOWN_FUNCTION方法清理請求現場,並且ZE開始回收變數和記憶體

  1. 關閉模組(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組件的生命週期多長

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.