




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
本文格式為Word版,下載可任意編輯——細(xì)讀PHP的生命周期導(dǎo)語(yǔ):PHP是一種通用開(kāi)源腳本語(yǔ)言。語(yǔ)法吸收了C語(yǔ)言、Java和Perl的特點(diǎn),利于學(xué)習(xí),使用廣泛,主要適用于Web開(kāi)發(fā)領(lǐng)域。下面我們來(lái)看看PHP的生命周期,夢(mèng)想對(duì)大家有所扶助。
啟動(dòng)
在調(diào)用每個(gè)模塊的模塊初始化前,會(huì)有一個(gè)初始化的過(guò)程,它包括:
初始化若干全局變量
這里的初始化全局變量大多數(shù)處境下是將其設(shè)置為NULL,有一些除外,譬如設(shè)置zuf(zend_utility_functions),以zuf.printf_function=php_printf為例,這里的php_printf在zend_startup函數(shù)中會(huì)被賦值給zend_printf作為全局函數(shù)指針使用,而zend_printf函數(shù)通常會(huì)作為常規(guī)字符串輸出訪(fǎng)用,譬如顯示程序調(diào)用棧的debug_print_backtrace就是使用它打印相關(guān)信息。
初始化若干常量
這里的常量是PHP自己的一些常量,這些常量要么是硬編碼在程序中,譬如PHP_VERSION,要么是寫(xiě)在配置頭文件中,譬如PEAR_EXTENSION_DIR,這些是寫(xiě)在config.w32.h文件中。
初始化ZEND引擎和核心組件
前面提到的zend_startup函數(shù)的作用就是初始化ZEND引擎,這里的初始化操作包括內(nèi)存管理初始化、全局使用的函數(shù)指針初始化(如前面所說(shuō)的zend_printf等),對(duì)PHP源文件舉行詞法分析、語(yǔ)法分析、中間代碼執(zhí)行的函數(shù)指針的賦值,初始化若干HashTable(譬如函數(shù)表,常量表等等),為ini文件解析做打定,為PHP源文件解析做打定,注冊(cè)內(nèi)置函數(shù)(如strlen、define等),注冊(cè)標(biāo)準(zhǔn)常量(如E_ALL、TRUE、NULL等)、注冊(cè)GLOBALS全局變量等。
解析php.ini
php_init_config函數(shù)的作用是讀取php.ini文件,設(shè)置配置參數(shù),加載zend擴(kuò)展并注冊(cè)PHP擴(kuò)展函數(shù)。此函數(shù)分為如下幾步:初始化參數(shù)配置表,調(diào)用當(dāng)前模式下的ini初始化配置,譬如CLI模式下,會(huì)做如下初始化:
INI_DEFAULTreport_zend_debug,0;
INI_DEFAULTdisplay_errors,1;
不過(guò)在其它模式下卻沒(méi)有這樣的初始化操作。接下來(lái)會(huì)的各種操作都是查找ini文件:
判斷是否有php_ini_path_override,在CLI模式下可以通過(guò)-c參數(shù)指定此路徑(在php的命令參數(shù)中-c表示在指定的路徑中查找ini文件)。
假設(shè)沒(méi)有php_ini_path_override,判斷php_ini_ignore是否為非空(疏忽php.ini配置,這里也就CLI模式下有用,使用-n參數(shù))。
假設(shè)不疏忽ini配置,那么開(kāi)頭處理php_ini_search_path(查找ini文件的路徑),這些路徑包括CWD當(dāng)前路徑,不過(guò)這種不適用CLI模式、執(zhí)行腳本所在目次、環(huán)境變量PATH和PHPRC和配置文件中的PHP_CONFIG_FILE_PATH的值。
在打定完查找路徑后,PHP會(huì)判斷現(xiàn)在的ini路徑(php_ini_file_name)是否為文件和是否可開(kāi)啟。假設(shè)這里ini路徑是文件并且可開(kāi)啟,那么會(huì)使用此文件,也就是CLI模式下通過(guò)-c參數(shù)指定的ini文件的優(yōu)先級(jí)是最高的,其次是PHPRC指定的文件,第三是在探尋路徑中查找php-%sapi-module-name%.ini文件(如CLI模式下理應(yīng)是查找php-cli.ini文件),結(jié)果才是探尋路徑中查找php.ini文件。
全局操作函數(shù)的初始化
php_startup_auto_globals函數(shù)會(huì)初始化在用戶(hù)空間所使用頻率很高的一些全局變量,如:$_GET、$_POST、$_FILES等。這里只是初始化,所調(diào)用的zend_register_auto_global函數(shù)也只是將這些變量名添加到CGauto_globals這個(gè)變量表。
php_startup_sapi_content_types函數(shù)用來(lái)初始化SAPI對(duì)于不同類(lèi)型內(nèi)容的處理函數(shù),這里的處理函數(shù)包括POST數(shù)據(jù)默認(rèn)處理函數(shù)、默認(rèn)數(shù)據(jù)處理函數(shù)等。
初始化靜態(tài)構(gòu)建的模塊和共享模塊MINIT
php_register_internal_extensions_func函數(shù)用來(lái)注冊(cè)靜態(tài)構(gòu)建的模塊,也就是默認(rèn)加載的模塊,我們可以將其認(rèn)為為內(nèi)置模塊。在PHP5.3.0版本中內(nèi)置的模塊包括PHP標(biāo)準(zhǔn)擴(kuò)展模塊(/ext/standard/目次,這里是我們用的最頻繁的函數(shù),譬如字符串函數(shù),數(shù)學(xué)函數(shù),數(shù)組操作函數(shù)等等),日歷擴(kuò)展模塊、FTP擴(kuò)展模塊、session擴(kuò)展模塊等。這些內(nèi)置模塊并不是一成不變的,在不同的PHP模板中,由于不同時(shí)間的需求或其它影響因素會(huì)導(dǎo)致這些默認(rèn)加載的模塊會(huì)變化,譬如從代碼中我們就可以看到mysql、xml等擴(kuò)展模塊曾經(jīng)或?qū)?lái)會(huì)作為內(nèi)置模塊展現(xiàn)。
模塊初始化會(huì)執(zhí)行兩個(gè)操作:
1.將這些模塊注冊(cè)到已注冊(cè)模塊列表(module_registry),假設(shè)注冊(cè)的模塊已經(jīng)注冊(cè)過(guò)了,PHP會(huì)報(bào)ModuleXXXalreadyloaded的錯(cuò)誤。
2.將每個(gè)模塊中包含的函數(shù)注冊(cè)到函數(shù)表(CGfunction_table),假設(shè)函數(shù)無(wú)法添加,那么會(huì)報(bào)Unabletoregisterfunctions,unabletoload。
在注冊(cè)了靜態(tài)構(gòu)建的模塊后,PHP會(huì)注冊(cè)附加的模塊,不同的模式下可以加載不同的模塊集,譬如在CLI模式下是沒(méi)有這些附加的模塊的。
在內(nèi)置模塊和附加模塊后,接下來(lái)是注冊(cè)通過(guò)共享對(duì)象(譬如DLL)和php.ini文件生動(dòng)配置的擴(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)容。
禁用函數(shù)和類(lèi)
php_disable_functions函數(shù)用來(lái)禁用PHP的一些函數(shù)。這些被禁用的函數(shù)來(lái)自PHP的配置文件的disable_functions變量。其禁用的過(guò)程是調(diào)用zend_disable_function函數(shù)將指定的函數(shù)名從CGfunction_table函數(shù)表中刪除。
php_disable_classes函數(shù)用來(lái)禁用PHP的一些類(lèi)。這些被禁用的類(lèi)來(lái)自PHP的配置文件的disable_classes變量。其禁用的過(guò)程是調(diào)用zend_disable_class函數(shù)將指定的類(lèi)名從CGclass_table類(lèi)表中刪除。
ACTIVATION
在處理了文件相關(guān)的內(nèi)容,PHP會(huì)調(diào)用php_request_startup做苦求初始化操作??嗲蟪跏蓟僮?,除了圖中顯示的調(diào)用每個(gè)模塊的苦求初始化函數(shù)外,還做了較多的其它工作,其主要內(nèi)容如下:
激活ZEND引擎
gc_reset函數(shù)用來(lái)重置垃圾收集機(jī)制,當(dāng)然這是在PHP5.3之后才有的。
init_compiler函數(shù)用來(lái)初始化編譯器,譬如將編譯過(guò)程中在放opcode的數(shù)組清空,打定編譯時(shí)用來(lái)的數(shù)據(jù)布局等等。
init_executor函數(shù)用來(lái)初始化中間代碼執(zhí)行過(guò)程。在編譯過(guò)程中,函數(shù)列表、類(lèi)列表等都存放在編譯時(shí)的全局變量中,在打定執(zhí)行過(guò)程時(shí),會(huì)將這些列表賦值給執(zhí)行的全局變量中,如:EGfunction_table=CGfunction_table;中間代碼執(zhí)行是在PHP的執(zhí)行虛擬棧中,初始化時(shí)這些棧等都會(huì)一起被初始化。除了棧,還有存放變量的符號(hào)表EGsymbol_table會(huì)被初始化為50個(gè)元素的hashtable,存放對(duì)象的EGobjects_store被初始化了1024個(gè)元素。PHP的執(zhí)行環(huán)境除了上面的一些變量外,還有錯(cuò)誤處理,奇怪處理等等,這些都是在這里被初始化的。通過(guò)php.ini配置的zend_extensions也是在這里被遍歷調(diào)用activate函數(shù)。
激活SAPI
sapi_activate函數(shù)用來(lái)初始化SGsapi_headers和SGrequest_info,并且針對(duì)HTTP苦求的方法設(shè)置一些內(nèi)容,譬如當(dāng)苦求方法為HEAD時(shí),設(shè)置SGrequest_info.headers_only=1;此函數(shù)最重要的一個(gè)操作是處理苦求的數(shù)據(jù),其最終都會(huì)調(diào)用sapi_module.default_post_reader。而sapi_module.default_post_reader在前面的模塊初始化是通過(guò)php_startup_sapi_content_types函數(shù)注冊(cè)了默認(rèn)處理函數(shù)為main/php_content_types.c文件中php_default_post_reader函數(shù)。此函數(shù)會(huì)將POST的原始數(shù)據(jù)寫(xiě)入$HTTP_RAW_POST_DATA變量。
在處理了post數(shù)據(jù)后,PHP會(huì)通過(guò)sapi_module.read_cookies讀取cookie的值,在CLI模式下,此函數(shù)的實(shí)現(xiàn)為sapi_cli_read_cookies,而在函數(shù)體中卻只有一個(gè)returnNULL;
假設(shè)當(dāng)前模式下有設(shè)置activate函數(shù),那么運(yùn)行此函數(shù),激活SAPI,在CLI模式下此函數(shù)指針被設(shè)置為NULL。
環(huán)境初始化
這里的環(huán)境初始化是指在用戶(hù)空間中需要用到的一些環(huán)境變量初始化,這里的環(huán)境包括服務(wù)器環(huán)境、苦求數(shù)據(jù)環(huán)境等。實(shí)際到我們用到的變量,就是$_POST、$_GET、$_COOKIE、$_SERVER、$_ENV、$_FILES。和sapi_module.default_post_reader一樣,sapi_module.treat_data的值也是在模塊初始化時(shí),通過(guò)php_startup_sapi_content_types函數(shù)注冊(cè)了默認(rèn)數(shù)據(jù)處理函數(shù)為main/php_variables.c文件中php_default_treat_data函數(shù)。
以$_COOKIE為例,php_default_treat_data函數(shù)會(huì)對(duì)依據(jù)分隔符,將全體的cookie拆分并賦值給對(duì)應(yīng)的變量。
模塊苦求初始化
PHP通過(guò)zend_activate_modules函數(shù)實(shí)現(xiàn)模塊的苦求初始化,也就是我們?cè)趫D中看到Calleachextension’sRINIT。此函數(shù)通過(guò)遍歷注冊(cè)在module_registry變量中的全體模塊,調(diào)用其RINIT方法實(shí)現(xiàn)模塊的苦求初始化操作。
運(yùn)行
php_execute_script函數(shù)包含了運(yùn)行PHP腳本的全部過(guò)程。
當(dāng)一個(gè)PHP文件需要解析執(zhí)行時(shí),它可能會(huì)需要執(zhí)行三個(gè)文件,其中包括一個(gè)前置執(zhí)行文件、當(dāng)前需要執(zhí)行的主文件和一個(gè)后置執(zhí)行文件。非當(dāng)前的兩個(gè)文件可以在php.ini文件通過(guò)auto_prepend_file參數(shù)和auto_append_file參數(shù)設(shè)置。假設(shè)將這兩個(gè)參數(shù)設(shè)置為空,那么禁用對(duì)應(yīng)的執(zhí)行文件。
對(duì)于需要解析執(zhí)行的文件,通過(guò)zend_compile_file(compile_file函數(shù))做詞法分析、語(yǔ)法分析和中間代碼生成操作,返回此文件的全體中間代碼。假設(shè)解析的文件有生成有效的中間代碼,那么調(diào)用zend_execute(execute函數(shù))執(zhí)行中間代碼。假設(shè)在執(zhí)行過(guò)程中展現(xiàn)奇怪并且用戶(hù)有定義對(duì)這些奇怪的處理,那么調(diào)用這些奇怪處理函數(shù)。在全體的操作都處理完后,PHP通過(guò)EGreturn_value_ptr_ptr返回結(jié)果。
DEACTIVATION
PHP關(guān)閉苦求的過(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ù)是在用戶(hù)空間添加進(jìn)來(lái)的。一個(gè)簡(jiǎn)樸的例子,我們可以在腳本出錯(cuò)時(shí)調(diào)用一個(gè)統(tǒng)一的函數(shù),給用戶(hù)一個(gè)友好一些的頁(yè)面,這個(gè)有點(diǎn)類(lèi)似于網(wǎng)頁(yè)中的404頁(yè)面。
執(zhí)行全體可用的__destruct函數(shù)。這里的析構(gòu)函數(shù)包括在對(duì)象池(EGobjects_store)中的全體對(duì)象的析構(gòu)函數(shù)以及EGsymbol_table中各個(gè)元素的析構(gòu)方法。
將全體的輸出刷出去。
發(fā)送HTTP應(yīng)答頭。這也是一個(gè)輸出字符串的過(guò)程,只是這個(gè)字符串可能符合某些模范。
遍歷每個(gè)模塊的關(guān)閉苦求方法,執(zhí)行模塊的苦求關(guān)閉操作,這就是我們?cè)趫D中看到的Calleachextension’sRSHUTDOWN。
銷(xiāo)毀全局變量表(PGhttp_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銷(xiāo)毀SGsapi
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)學(xué)-福建省莆田市2025屆高中畢業(yè)班第二次教學(xué)質(zhì)量檢測(cè)試卷(莆田二檢)試題和答案
- 2025年中考道德與法治二輪復(fù)習(xí):熱點(diǎn)時(shí)政專(zhuān)題練習(xí)題(含答案)
- 2025年中考道德與法治二輪復(fù)習(xí):七~九年級(jí)高頻考點(diǎn)提綱
- 刀片刺網(wǎng)施工方案
- 輕鋼平頂施工方案
- 苗木養(yǎng)護(hù)施工方案
- 2025年中考物理二輪復(fù)習(xí):簡(jiǎn)單機(jī)械、功和機(jī)械能 尖子生測(cè)試卷(含答案解析)
- 四川省金堂縣2025屆中考考前最后一卷生物試卷含解析
- 山西省朔州市朔城區(qū)重點(diǎn)名校2025屆中考生物模擬試卷含解析
- 別墅房建合同范例
- 社會(huì)科學(xué)基礎(chǔ)(高職學(xué)前教育專(zhuān)業(yè))PPT完整全套教學(xué)課件
- 藥物治療學(xué)-藥物治療的一般原則課件
- 空中乘務(wù)職業(yè)教育專(zhuān)業(yè)教學(xué)資源庫(kù)申報(bào)書(shū)
- 人教版PEP五年級(jí)下冊(cè)英語(yǔ)unit1單元復(fù)習(xí)課件
- 心肌炎病人的護(hù)理
- 四川麻將業(yè)余一級(jí)考級(jí)題庫(kù)
- 【人教版】三年級(jí)下冊(cè)數(shù)學(xué)課件《口算乘法》兩位數(shù)乘兩位數(shù)優(yōu)秀(第1課時(shí))
- 《小小理財(cái)家》課件PPT
- 《相交線(xiàn)與平行線(xiàn)》復(fù)習(xí)課一等獎(jiǎng)?wù)n件
- 部編版四年級(jí)語(yǔ)文下冊(cè)第3單元大單元整體教學(xué)設(shè)計(jì)課件(教案配套)
- 廉政建設(shè)監(jiān)理實(shí)施細(xì)則
評(píng)論
0/150
提交評(píng)論