首頁  >  文章  >  後端開發  >  php生命週期的詳解(圖)

php生命週期的詳解(圖)

不言
不言轉載
2018-10-23 17:03:234048瀏覽

這篇文章帶給大家的內容是關於php生命週期的詳解(圖),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

  • 第一個過程是模組初始化階段(MINIT), 在整個SAPI生命週期內(例如Apache啟動以後的整個生命週期內或命令列程式整個執行過程中), 過程只進行一次。第二個過程是模組啟動階段(RINIT),該過程發生在請求階段, 例如透過url請求某個頁面,則在每次請求之前都會進行模組啟動(RINIT請求開始)

  • 請求到達之後PHP初始化執行腳本的基本環境,例如建立一個執行環境,包括保存PHP運行過程中變數名稱和值內容的符號表, 以及目前所有的函數以及類別等資訊的符號表。然後PHP會呼叫​​所有模組的RINIT函數, 在這個階段各個模組也可以執行一些相關的操作

  • 一般腳本執行到結尾或透過呼叫exit()或die()函數, PHP都將進入結束階段。和開始階段對應,結束階段也分為兩個環節,一個在請求結束後停用模組(RSHUTDOWN,對應RINIT),一個在SAPI生命週期結束(Web伺服器退出或命令列腳本執行完畢退出)時關閉模組(MSHUTDOWN,對應MINIT)

單一進程SAPI生命週期

  • 開始- 請求開始- 請求關閉- 結束
    php生命週期的詳解(圖)

#啟動

#在呼叫每個模組的模組初始化前,會有一個初始化的過程,它包括:

  • 初始化若干全域變數

  • #初始化若干常數

  • ##初始化Zend引擎和核心元件

這裡的初始化操作包括記憶體管理初始化、 全域使用的函數指標初始化(如前面所說的zend_printf等),對PHP原始檔進行詞法分析、語法分析、 中間程式碼執行的函數指標的賦值,初始化若干HashTable(例如函數表,常數量表等等),為ini檔案解析做準備, 為PHP原始檔解析做準備,註冊內建函數(如strlen、define等),註冊標準常數(如E_ALL、TRUE、NULL等)、註冊GLOBALS全域變數等。

  • 解析php.ini

  • 全域運算子的初始化

  • 初始化靜態建構的模組和共用模組(MINIT)

將這些模組註冊到已註冊模組清單(module_registry),如果註冊的模組已經註冊過了,PHP會報Module XXX already loaded的錯誤。 1. 將每個模組中包含的函數註冊到函數表( CG(function_table) ),如果函數無法添加,則會報 Unable to register functions, unable to load。

在內建模組和附加模組後,接下來是註冊透過共享物件(例如DLL)和php.ini檔案靈活配置的擴充。

在所有的模組都註冊後,PHP會馬上執行模組初始化操作(zend_startup_modules)。它的整個過程就是依序遍歷每個模組,呼叫每個模組的模組初始化函數, 也就是在本小節前面所說的用宏PHP_MINIT_FUNCTION包含的內容。

在處理了檔案相關的內容,PHP會呼叫​​php_request_startup做請求初始化操作。請求初始化操作,除了圖中顯示的調用每個模組的請求初始化函數外,還做了較多的其它工作,其主要內容如下:

  • PHP的執行環境除了上面的一些變數外,還有錯誤處理,異常處理等等,這些都是在這裡初始化的。透過php.ini配置的zend_extensions也是在這裡被遍歷呼叫activate函數。

  • 啟動SAPI

  • 環境初始化

    #

這裡的環境初始化是指在使用者空間中需要用到的一些環境變數初始化,這裡的環境包括伺服器環境、請求資料環境等。實際到我們用到的變量,就是P#OST#_GET、C OOKI#E_SERVER、 #E

    #N
  • V

    ##、

_FILES。

模組要求初始化

######運行############DEACTIVATION###### ###PHP關閉請求的過程是一個若干個關閉操作的集合,這個集合存在於php_request_shutdown函數中。這個集合包括如下:###

呼叫所有透過register_shutdown_function()註冊的函數。這些在關閉時呼叫的函數是在用戶空間添加進來的。一個簡單的例子,我們可以在腳本出錯時呼叫一個統一的函數,給使用者一個友善一些的頁面,這個有點類似網頁中的404頁面。
執行所有可用的__destruct函數。這裡的析構函數包括在物件池(EG(objects_store)中的所有物件的析構函數以及EG(symbol_table)中各個元素的析構方法。
將所有的輸出刷出去。
傳送HTTP應答頭。這也是一個輸出字串的過程,只是這個字串可能符合某些規範。
遍歷每個模組的關閉請求方法,執行模組的請求關閉操作,這就是我們在圖中看到的Call each extension's RSHUTDOWN。
銷毀全域變數表(PG(http_globals))的變數。
透過zend_deactivate函數,關閉詞法分析器、語法分析器和中間程式碼執行器。
呼叫每個擴充的post-RSHUTDOWN函數。只是基本每個擴充的post_deactivate_func函數指標都是NULL。
關閉SAPI,透過sapi_deactivate銷毀SG(sapi_headers)、SG(request_info)等的內容。
關閉流的包裝器、關閉流的包裝器、關閉流的包裝器、關閉流流的過濾器。
關閉記憶體管理。
重新設定最大執行時間

結束

##最終到了要收尾的地方了。

flushsapi_flush將最後的內容刷新出去。其呼叫的是sapi_module.flush,在CLI模式下等價於fflush函數。

#關閉Zend引擎zend_shutdown將關閉Zend引擎。

以上是php生命週期的詳解(圖)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除