PHP內核探索:一次請求生命週期

深刻探討

真正的內部運行過程沒有這麼簡單。以上過程只是個簡略版,讓咱們再深刻挖掘一下,看看幕後還發生了些什麼。php

Apache啓動後,PHP解釋程序也隨之啓動。PHP的啓動過程有兩步:服務器

  • 第一步是初始化一些環境變量,這將在整個SAPI生命週期中發生做用;session

  • 第二步是生成只針對當前請求的一些變量設置。函數

PHP啓動第一步

不清楚什麼第一第二步是什麼?別擔憂,咱們接下來詳細討論一下。讓咱們先看看第一步,也是最主要的一步。要記住的是,第一步的操做在任何請求到達以前就發生了。spa

啓動Apache後,PHP解釋程序也隨之啓動。PHP調用各個擴展的MINIT方法,從而使這些擴展切換到可用狀態。看看php.ini文件裏打開了哪些擴展吧。 MINIT的意思是「模塊初始化」。各個模塊都定義了一組函數、類庫等用以處理其餘請求。code

一個典型的MINIT方法以下:生命週期

PHP_MINIT_FUNCTION(extension_name){ /* Initialize functions, classes etc */ }

PHP啓動第二步

當一個頁面請求發生時,SAPI層將控制權交給PHP層。因而PHP設置了用於回覆本次請求所需的環境變量。同時,它還創建一個變量表,用來存放執 行過程 中產生的變量名和值。PHP調用各個模塊的RINIT方法,即「請求初始化」。一個經典的例子是Session模塊的RINIT,若是在php.ini中 啓用了Session模塊,那在調用該模塊的RINIT時就會初始化$_SESSION變量,並將相關內容讀入;RINIT方法能夠看做是一個準備過程, 在程序執行之間就會自動啓動。 一個典型的RINIT方法以下:內存

PHP_RINIT_FUNCTION(extension_name) { /* Initialize session variables,pre-populate variables, redefine global variables etc */ }

PHP關閉第一步

如同PHP啓動同樣,PHP的關閉也分兩步。一旦頁面執行完畢(不管是執行到了文件末尾仍是用exit或die函數停止),PHP就會啓動清理程 序。它會按順序調用各個模塊的RSHUTDOWN方法。 RSHUTDOWN用以清除程序運行時產生的符號表,也就是對每一個變量調用unset函數。it

一個典型的RSHUTDOWN方法以下:io

PHP_RSHUTDOWN_FUNCTION(extension_name) { /* Do memory management, unset all variables used in the last PHP call etc */ }

PHP關閉第二步

最後,全部的請求都已處理完畢,SAPI也準備關閉了,PHP開始執行第二步:PHP調用每一個擴展的MSHUTDOWN方法,這是各個模塊最後一次釋放內存的機會。

一個典型的RSHUTDOWN方法以下:

PHP_MSHUTDOWN_FUNCTION(extension_name) { /* Free handlers and persistent memory etc */ }

這樣,整個PHP生命週期就結束了。要注意的是,只有在服務器沒有請求的狀況下才會執行「啓動第一步」和「關閉第二步」。

相關文章
相關標籤/搜索