PHP核心--生命週期____PHP

來源:互聯網
上載者:User
瞭解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生命週期就結束了。要注意的是,只有在伺服器沒有請求的情況下才會執行“啟動第一步”和“關閉第二步”。
原文地址:http://blog.csdn.net/ty_hf/article/details/52877759


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.