PHP的構成和生命周日是什么

這篇文章主要介紹“PHP的構成和生命周日是什么”,在日常操作中,相信很多人在PHP的構成和生命周日是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”PHP的構成和生命周日是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

創(chuàng)新互聯(lián)專注于烏拉特前企業(yè)網(wǎng)站建設,響應式網(wǎng)站開發(fā),商城網(wǎng)站開發(fā)。烏拉特前網(wǎng)站建設公司,為烏拉特前等地區(qū)提供建站服務。全流程按需定制,專業(yè)設計,全程項目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務

一、PHP開源源代碼下載地址:

https://github.com/php/php-src.git

二、PHP的構成

1、目錄結構

PHP的構成和生命周日是什么

2、目錄分析

(1)sapi目錄是PHP的應用接口層。

(2)main為php的主要代碼,主要是輸入/輸出、Web通信、PHP框架的初始化操作等,比如fastcgi協(xié)議的解析、擴展的加載、PHP配置的解析等工作都是在這里完成的。

(3)Zend目錄是PHP解析器的主要實現(xiàn),即ZendVM,它是PHP語言的核心實現(xiàn),PHP代碼的解釋、執(zhí)行都是由Zend完成的。

(4)ext目錄是PHP的擴展目錄,比如php的curl擴展,gd庫擴展、pdo擴展等都是在這里。

(5)TSRM目錄為線程安全相關的實現(xiàn)。

(6)PHP各組成部分之間關系圖:

PHP的構成和生命周日是什么

3、SAPI

(1)PHP是一個腳本解析器,提供腳本的解析與執(zhí)行。它的輸入是普通的文本,然后由PHP解析器按照預先定義好的語法規(guī)則進行解析執(zhí)行。我們可以在不同環(huán)境中應用這個解析器,比如命令行下、Web環(huán)境下、嵌入其他應用中使用。為此,PHP提供了一個SAPI層以適配不同的應用環(huán)境,SAPI可以認為是PHP的宿主環(huán)境。

(2)SAPI也是整個PHP框架最外層的一部分,它主要負責PHP框架的初始化工作。SAPI代碼位于PHP源碼的 /sapi 目錄下,經(jīng)常用到的兩個SAPI是Cli和Fpm。

4、ZendVM

(1)ZendVM是一個虛擬的計算機,它介于PHP應用和實際計算機中間,我們編寫的PHP代碼就是被它解釋執(zhí)行的。ZendVM是PHP語言的核心實現(xiàn),他主要由兩部分組成:編譯器和執(zhí)行器。

(2)編譯器負責將PHP解釋為執(zhí)行器可識別的指令,執(zhí)行器負責執(zhí)行編譯器解釋出的指令。

(3)ZendVM的角色等同于Java中的JVM,它們都是抽象出的虛擬計算機。

5、Extension

(1)擴展是PHP內(nèi)核提供的一套用于擴充PHP功能的一種方式,PHP社區(qū)中有豐富的擴展可供使用,這些擴展為PHP提供了大量實用的功能,PHP中很多操作的函數(shù)都是通過擴展提供的。

(2)通過擴展,我們可以使用C/C++實現(xiàn)更強大的功能和更高的性能。擴展分為PHP擴展和Zend擴展,PHP擴展比較常見,而Zend擴展主要應用于ZendVM,我們所熟知的Opcache就是Zend擴展。

三、PHP生命周期

1、PHP的整個生命周期被劃分為以下幾個階段:

(1)模塊初始化階段(module startup)

(2)請求初始化階段(request startup)

(3)腳本執(zhí)行階段(execute sccript)

(4)請求關閉階段(request shutdown)

(5)模塊關閉階段(module shutdown)

注:根據(jù)不同SAPI的實現(xiàn),各階段的執(zhí)行情況會有一些差異,比如命令行模式下,每次執(zhí)行一個腳本都會完成的經(jīng)歷這些階段。而FastCgi模式下則在啟動時執(zhí)行一次模塊初始化,然后各個請求只經(jīng)歷請求初始化,腳本執(zhí)行,請求關閉幾個階段,在SAPI關閉時,才經(jīng)歷模塊關閉階段。

2、模塊初始化階段—分析

(1)這個階段主要進行PHP框架和Zend引擎的初始化操作。該階段的入口函數(shù)為php_module_startup()。這個階段一般只在SAPI啟動時執(zhí)行一次,對于Fpm而言,就是在Fpm的master進程啟動時執(zhí)行的。

(2)該階段的幾個主要處理如下:

(3)激活SAPI:sapi_activate(),初始化請求信息SG(request_info)、設置讀取POST請求的handle等。

(4)啟動PHP輸出:php_output_startup()

(5)初始化垃圾回收器:gc_globals_ctor(),并分配zend_gc_globals內(nèi)存。

(6)啟動Zend引擎:zend_startup(),主要操作包括

(6.1)啟動內(nèi)存池 start_memory_manager()

(6.2)設置一些util函數(shù)句柄,如zend_error_cb、zend_pringf、zend_write等。

(6.3)設置Zend虛擬機編譯、執(zhí)行器的函數(shù)句柄zend_compile_file、zend_execute_ex、垃圾回收函數(shù)句柄gc_collect_cycles

(6.4)分配函數(shù)符號表 方法符號表(function_table)、類符號表(class_table)、常量符號表(zend_constants)等,如果是多線程的話,還會分配編譯器、執(zhí)行器的全局變量。

(6.5)注冊Zend核心擴展:zend_startup_builtin_funtions(),這個擴展是內(nèi)核提供的,該過程將注冊Zend核心擴展提供的函數(shù),如strlen、define、func_get_args、class_exists等。

(6.6)注冊Zend定義的標準常量:zend_register_standard_constants(),比如 E_ERROR、E_WARNING、E_ALL、TRUE、FALSE等。

(6.7)注冊$GLOBALS超全局變量的獲取handle。

(6.8)分配php.ini配置的存儲符號表 EG(ini_directives)。

(7)注冊PHP定義的常量:PHP_VERSION、PHP_ZTS、PHP_SAPI等。

(8)解析php.ini:解析完成后所有的php.ini配置保存在configuration_hash哈希表中。

(9)映射PHP、Zend核心的php.ini配置:根據(jù)解析出的php.ini,獲取對應的配置值,將最終的配置插入EG(ini_directives)哈希表。

(10)注冊用于獲取$_GET、$_POST、$_COOKIE、$_SERVER、$_ENV、$_REQUEST、$_FILES變量的handle。

(11)注冊靜態(tài)編譯的擴展:php_register_internal_extensions_func()。

(12)注冊動態(tài)加載的擴展:php_init_register_extensions(),將php.ini中配置的擴展加載到PHP中。

(13)回調(diào)各擴展定義的module startup鉤子函數(shù),即通過PHP_MINIT_FUNCTION()定義的函數(shù)。

(14)注冊php.ini中禁用的函數(shù)、類:disable_funstions、disable_classes。

3、請求初始化階段—分析

該階段是在請求處理前每一個請求都會經(jīng)歷的一個階段。對于fpm而言,是在worker進程accept一個請求且獲取、解析完請求數(shù)據(jù)后的一個階段。該階段的處理函數(shù)為php_request_startup()。

主要處理有以下幾個:

(1)激活輸出:php_output_activate()

(2)激活Zend引擎:zend_activate(),主要操作有

(2.1)重置垃圾回收器:gc_reset()

(2.2)初始化編譯器:ini_compiler()

(2.3)初始化執(zhí)行器:ini_exexutor(),將 EG(function_table)和 EG(class_table)分別執(zhí)行 CG(function_table)和CG(class_table)。

(2.4)初始化全局變量符號表 EG(symbol_table)、include過的文件符號表 EG(included_files)

(2.5)初始化詞法掃描器:sapi_activate()

(3)激活SAPI:sapi_activate()

(4)回調(diào)個擴展定義的request startup鉤子函數(shù):zend_activate_modules()

4、腳本執(zhí)行階段—分析

(1)該階段包括PHP代碼的編譯、執(zhí)行兩個核心階段,這也是Zend引擎最重要的功能。

(2)在編譯階段,PHP腳本將經(jīng)歷從PHP源代碼到抽象語法樹,再到opline指令的轉(zhuǎn)化過程,最終生成的opline指令就是Zend引擎可識別的執(zhí)行指令,這些指令被執(zhí)行器執(zhí)行,這就是PHP代碼解釋執(zhí)行的過程。該階段入口函數(shù)為php_execute_script()。

5、請求關閉階段—分析

(1)該階段將flush輸出內(nèi)容、發(fā)送HTTP應答header頭、清理局部變量、關閉編譯器、關閉執(zhí)行器等。

(2)另外,在該階段將回調(diào)各擴展的request shutdown鉤子函數(shù)。

(3)該階段與請求初始化階段操作是相反的。

6、模塊關閉階段—分析

該階段在SAPI關閉時執(zhí)行,與模塊初始化階段對應,主要進行資源的清理、PHP各模塊的關閉操作,同時將回調(diào)各擴展的 module shutdown 鉤子函數(shù)。

到此,關于“PHP的構成和生命周日是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

文章標題:PHP的構成和生命周日是什么
本文URL:http://muchs.cn/article24/ihicje.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設計、品牌網(wǎng)站建設網(wǎng)站內(nèi)鏈、網(wǎng)站設計公司虛擬主機、搜索引擎優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設