來(lái)源:不言 發(fā)布時(shí)間:2018-10-25 15:22:00 閱讀量:712
本篇文章給大家?guī)?lái)的內(nèi)容是關(guān)于php生命周期的詳解(圖),有一定的參考價(jià)值,有需要的朋友可以參考一下,希望對(duì)你有所幫助。
第一個(gè)過(guò)程是模塊初始化階段(MINIT), 在整個(gè)SAPI生命周期內(nèi)(例如Apache啟動(dòng)以后的整個(gè)生命周期內(nèi)或者命令行程序整個(gè)執(zhí)行過(guò)程中), 該過(guò)程只進(jìn)行一次。第二個(gè)過(guò)程是模塊激活階段(RINIT),該過(guò)程發(fā)生在請(qǐng)求階段, 例如通過(guò)url請(qǐng)求某個(gè)頁(yè)面,則在每次請(qǐng)求之前都會(huì)進(jìn)行模塊激活(RINIT請(qǐng)求開(kāi)始)
請(qǐng)求到達(dá)之后PHP初始化執(zhí)行腳本的基本環(huán)境,例如創(chuàng)建一個(gè)執(zhí)行環(huán)境,包括保存PHP運(yùn)行過(guò)程中變量名稱和值內(nèi)容的符號(hào)表, 以及當(dāng)前所有的函數(shù)以及類等信息的符號(hào)表。然后PHP會(huì)調(diào)用所有模塊的RINIT函數(shù), 在這個(gè)階段各個(gè)模塊也可以執(zhí)行一些相關(guān)的操作
一般腳本執(zhí)行到末尾或者通過(guò)調(diào)用exit()或die()函數(shù), PHP都將進(jìn)入結(jié)束階段。和開(kāi)始階段對(duì)應(yīng),結(jié)束階段也分為兩個(gè)環(huán)節(jié),一個(gè)在請(qǐng)求結(jié)束后停用模塊(RSHUTDOWN,對(duì)應(yīng)RINIT), 一個(gè)在SAPI生命周期結(jié)束(Web服務(wù)器退出或者命令行腳本執(zhí)行完畢退出)時(shí)關(guān)閉模塊(MSHUTDOWN,對(duì)應(yīng)MINIT)
單進(jìn)程SAPI生命周期
開(kāi)始 - 請(qǐng)求開(kāi)始 - 請(qǐng)求關(guān)閉 - 結(jié)束
啟動(dòng)
在調(diào)用每個(gè)模塊的模塊初始化前,會(huì)有一個(gè)初始化的過(guò)程,它包括:
初始化若干全局變量
初始化若干常量
初始化Zend引擎和核心組件
這里的初始化操作包括內(nèi)存管理初始化、 全局使用的函數(shù)指針初始化(如前面所說(shuō)的zend_printf等),對(duì)PHP源文件進(jìn)行詞法分析、語(yǔ)法分析、 中間代碼執(zhí)行的函數(shù)指針的賦值,初始化若干HashTable(比如函數(shù)表,常量表等等),為ini文件解析做準(zhǔn)備, 為PHP源文件解析做準(zhǔn)備,注冊(cè)內(nèi)置函數(shù)(如strlen、define等),注冊(cè)標(biāo)準(zhǔn)常量(如E_ALL、TRUE、NULL等)、注冊(cè)GLOBALS全局變量等。
解析php.ini
全局操作函數(shù)的初始化
初始化靜態(tài)構(gòu)建的模塊和共享模塊(MINIT)
將這些模塊注冊(cè)到已注冊(cè)模塊列表(module_registry),如果注冊(cè)的模塊已經(jīng)注冊(cè)過(guò)了,PHP會(huì)報(bào)Module XXX already loaded的錯(cuò)誤。 1. 將每個(gè)模塊中包含的函數(shù)注冊(cè)到函數(shù)表( CG(function_table) ),如果函數(shù)無(wú)法添加,則會(huì)報(bào) Unable to register functions, unable to load。
在內(nèi)置模塊和附加模塊后,接下來(lái)是注冊(cè)通過(guò)共享對(duì)象(比如DLL)和php.ini文件靈活配置的擴(kuò)展。
在所有的模塊都注冊(cè)后,PHP會(huì)馬上執(zhí)行模塊初始化操作(zend_startup_modules)。 它的整個(gè)過(guò)程就是依次遍歷每個(gè)模塊,調(diào)用每個(gè)模塊的模塊初始化函數(shù), 也就是在本小節(jié)前面所說(shuō)的用宏P(guān)HP_MINIT_FUNCTION包含的內(nèi)容。
在處理了文件相關(guān)的內(nèi)容,PHP會(huì)調(diào)用php_request_startup做請(qǐng)求初始化操作。 請(qǐng)求初始化操作,除了圖中顯示的調(diào)用每個(gè)模塊的請(qǐng)求初始化函數(shù)外,還做了較多的其它工作,其主要內(nèi)容如下:
PHP的執(zhí)行環(huán)境除了上面的一些變量外,還有錯(cuò)誤處理,異常處理等等,這些都是在這里被初始化的。 通過(guò)php.ini配置的zend_extensions也是在這里被遍歷調(diào)用activate函數(shù)。
激活SAPI
環(huán)境初始化
這里的環(huán)境初始化是指在用戶空間中需要用到的一些環(huán)境變量初始化,這里的環(huán)境包括服務(wù)器環(huán)境、請(qǐng)求數(shù)據(jù)環(huán)境等。 實(shí)際到我們用到的變量,就是POST、_GET、COOKIE、_SERVER、ENV、_FILES。
模塊請(qǐng)求初始化
運(yùn)行
DEACTIVATION
PHP關(guān)閉請(qǐng)求的過(guò)程是一個(gè)若干個(gè)關(guān)閉操作的集合,這個(gè)集合存在于php_request_shutdown函數(shù)中。 這個(gè)集合包括如下內(nèi)容:
調(diào)用所有通過(guò)register_shutdown_function()注冊(cè)的函數(shù)。這些在關(guān)閉時(shí)調(diào)用的函數(shù)是在用戶空間添加進(jìn)來(lái)的。 一個(gè)簡(jiǎn)單的例子,我們可以在腳本出錯(cuò)時(shí)調(diào)用一個(gè)統(tǒng)一的函數(shù),給用戶一個(gè)友好一些的頁(yè)面,這個(gè)有點(diǎn)類似于網(wǎng)頁(yè)中的404頁(yè)面。
執(zhí)行所有可用的__destruct函數(shù)。 這里的析構(gòu)函數(shù)包括在對(duì)象池(EG(objects_store)中的所有對(duì)象的析構(gòu)函數(shù)以及EG(symbol_table)中各個(gè)元素的析構(gòu)方法。
將所有的輸出刷出去。
發(fā)送HTTP應(yīng)答頭。這也是一個(gè)輸出字符串的過(guò)程,只是這個(gè)字符串可能符合某些規(guī)范。
遍歷每個(gè)模塊的關(guān)閉請(qǐng)求方法,執(zhí)行模塊的請(qǐng)求關(guān)閉操作,這就是我們?cè)趫D中看到的Call each extension’s RSHUTDOWN。
銷毀全局變量表(PG(http_globals))的變量。
通過(guò)zend_deactivate函數(shù),關(guān)閉詞法分析器、語(yǔ)法分析器和中間代碼執(zhí)行器。
調(diào)用每個(gè)擴(kuò)展的post-RSHUTDOWN函數(shù)。只是基本每個(gè)擴(kuò)展的post_deactivate_func函數(shù)指針都是NULL。
關(guān)閉SAPI,通過(guò)sapi_deactivate銷毀SG(sapi_headers)、SG(request_info)等的內(nèi)容。
關(guān)閉流的包裝器、關(guān)閉流的過(guò)濾器。
關(guān)閉內(nèi)存管理。
重新設(shè)置最大執(zhí)行時(shí)間
結(jié)束
最終到了要收尾的地方了。
flush
sapi_flush將最后的內(nèi)容刷新出去。其調(diào)用的是sapi_module.flush,在CLI模式下等價(jià)于fflush函數(shù)。
關(guān)閉Zend引擎
zend_shutdown將關(guān)閉Zend引擎。
在線
客服
服務(wù)時(shí)間:周一至周日 08:30-18:00
選擇下列產(chǎn)品馬上在線溝通:
客服
熱線
7*24小時(shí)客服服務(wù)熱線
關(guān)注
微信
關(guān)注官方微信