亚洲欧美日韩综合系列在线_91精品人妻一区二区_欧美大肥婆一级特大AA片_九色91视频免费观看_亚洲综合国产精品_av中文字幕在线不卡_久久精品色综合网_看黄色视频的软件_无卡无码高清中文字幕码2024_亚洲欧美日韩天堂网

php生命周期的詳解

來(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é)束
    2345截圖20181023170210.png

啟動(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引擎。


標(biāo)簽: PHP
分享:
評(píng)論:
你還沒(méi)有登錄,請(qǐng)先