站長(zhǎng)資訊網(wǎng)
        最全最豐富的資訊網(wǎng)站

        PHP的構(gòu)成是什么?生命周期是怎樣的?

        本篇文章給大家介紹一下PHP的構(gòu)成是什么?生命周期是怎樣的?。有一定的參考價(jià)值,有需要的朋友可以參考一下,希望對(duì)大家有所幫助。

        PHP的構(gòu)成是什么?生命周期是怎樣的?

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

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

        二、PHP的構(gòu)成

        1、目錄結(jié)構(gòu)

        PHP的構(gòu)成是什么?生命周期是怎樣的?

        2、目錄分析

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

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

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

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

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

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

        PHP的構(gòu)成是什么?生命周期是怎樣的?

        3、SAPI

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

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

        4、ZendVM

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

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

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

        5、Extension

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

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

        三、PHP生命周期

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

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

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

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

        (4)請(qǐng)求關(guān)閉階段(request shutdown)

        (5)模塊關(guān)閉階段(module shutdown)

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

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

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

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

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

        (4)啟動(dòng)PHP輸出:php_output_startup()

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

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

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

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

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

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

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

        (6.6)注冊(cè)Zend定義的標(biāo)準(zhǔn)常量:zend_register_standard_constants(),比如 E_ERROR、E_WARNING、E_ALL、TRUE、FALSE等。

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

        (6.8)分配php.ini配置的存儲(chǔ)符號(hào)表 EG(ini_directives)。

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

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

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

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

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

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

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

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

        3、請(qǐng)求初始化階段—分析

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

        主要處理有以下幾個(gè):

        (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)初始化全局變量符號(hào)表 EG(symbol_table)、include過的文件符號(hào)表 EG(included_files)

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

        (3)激活SAPI:sapi_activate()

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

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

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

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

        5、請(qǐng)求關(guān)閉階段—分析

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

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

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

        6、模塊關(guān)閉階段—分析

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

        推薦學(xué)習(xí):php視頻教程

        贊(0)
        分享到: 更多 (0)
        網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
        主站蜘蛛池模板: 国产精品狼人久久久久影院| 午夜精品久久影院蜜桃| 精品国精品国产自在久国产应用男| 久久亚洲中文字幕精品有坂深雪| 国产三级精品三级在线观看| 国产精品后入内射日本在线观看| 亚洲欧美精品午睡沙发| 国产精品美女久久久久av爽| 国产精品久久影院| 精品无码人妻夜人多侵犯18 | 国产亚洲欧美精品永久| 宅男在线国产精品无码| 女人高潮内射99精品| 国产系列高清精品第一页| 91精品福利在线观看| 国产精品视频网站你懂得| 国产精品污WWW在线观看| 麻豆国产在线精品国偷产拍| 亚洲七七久久精品中文国产| 欧美日韩国产精品系列| 久久精品成人欧美大片| 国产伦精品一区二区三区视频猫咪| 亚洲一区精品中文字幕| 日韩精品一区二区三区大桥未久| 97在线精品视频| 91精品国产福利尤物| 国产成人精品2021| 91精品国产综合久久婷婷| 国产成人精品手机在线观看| 国产精品嫩草影院AV| 99久久婷婷免费国产综合精品| 国产AV国片精品有毛| 3D动漫精品一区二区三区| 2021国产精品成人免费视频| 99久久精品国产麻豆| 九九热在线精品视频| 2024国产精品极品色在线| 国产精品久久久久一区二区三区 | 亚洲精品无码久久久久去q | 四虎国产精品成人| 中文字幕日韩精品有码视频|