首頁 > 後端開發 > php教程 > PHP的構成是什麼?生命週期是怎樣的?

PHP的構成是什麼?生命週期是怎樣的?

慕斯
發布: 2023-04-10 08:30:01
轉載
4528 人瀏覽過

這篇文章要跟大家介紹一下PHP的組成是什麼?生命週期是怎樣的? 。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。

PHP的構成是什麼?生命週期是怎樣的?

一、PHP開源原始碼下載位址:

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

二、PHP的組成

1、目錄結構

2、目錄分析

(1)sapi目錄是PHP的應用介面層。

(2)main為php的主要程式碼,主要是輸入/輸出、Web通訊、PHP框架的初始化操作等,例如fastcgi協定的解析、擴充的載入、PHP配置的解析等工作都是在這裡完成的。

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

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

(5)TSRM目錄為線程安全相關的實作。

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

 

#3、SAPI

(1)PHP是一個腳本解析器,提供腳本的解析與執行。它的輸入是普通的文本,然後由PHP解析器依照預先定義好的語法規則進行解析執行。我們可以在不同環境中應用這個解析器,例如命令列下、Web環境下、嵌入其他應用程式中使用。為此,PHP提供了一個SAPI層以適合不同的應用環境,SAPI可以視為PHP的宿主環境。

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

4、ZendVM

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

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

(3)ZendVM的角色等同於Java中的JVM,它們都是抽象化的虛擬電腦。

5、Extension

(1)擴充功能是PHP核心提供的一套用於擴充PHP功能的一種方式,PHP社群中有豐富的擴充可供使用,這些擴充功能為PHP提供了大量實用的功能,PHP中許多操作的函數都是透過擴充提供的。

(2)透過擴展,我們可以使用C/C 來實現更強大的功能和更高的效能。擴展分為PHP擴展和Zend擴展,PHP擴展較常見,而Zend擴展主要應用於ZendVM,我們所熟知的Opcache就是Zend擴展。

三、PHP生命週期

1、PHP的整個生命週期被分割為以下階段:

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

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

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

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

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

註:根據不同SAPI的實現,各階段的執行情況會有一些差異,例如命令列模式下,每次執行一個腳本都會完成的經歷這些階段。而FastCgi模式下則在啟動時執行一次模組初始化,然後各個請求只經歷請求初始化,腳本執行,請求關閉幾個階段,在SAPI關閉時,才經歷模組關閉階段。

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

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

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

(3)啟動SAPI:sapi_activate(),初始化請求資訊SG(request_info)、設定讀取POST請求的handle等。

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

(5)初始化垃圾回收器:gc_globals_ctor(),並分配zend_gc_globals記憶體。

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

      (6.1)啟動記憶體池start_memory_manager()

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

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

       (6.4)分配函數表(6.4)分配函數表方法表符號表(class_table)、常數符號表(zend_constants)等,如果是多執行緒的話,也會分配編譯器、執行器的全域變數。

       (6.5)註冊Zend核心擴充:zend_startup_builtin_funtions(),這個擴充功能是核心提供的,該流程將註冊Zend核心擴充所提供的函數,如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配置:根據解析出的php.ini,取得對應的配置值,將最終的配置插入EG(ini_directives)雜湊表。

(10)註冊用於取得$_GET、$_POST、$_COOKIE、$_SERVER、$_ENV、$_REQUEST、$_FILES變數的handle。

(11)註冊靜態編譯的擴充:php_register_internal_extensions_func()。

(12)註冊動態載入的擴充功能:php_init_register_extensions(),將php.ini中配置的擴充功能載入到PHP。

(13)回​​呼各擴充定義的module startup鉤子函數,也就是透過PHP_MINIT_FUNCTION()定義的函數。

(14)註冊php.ini中停用的函數、類別:disable_funstions、disable_classes。

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

該階段是在請求處理前每一個請求都會經歷的階段。對fpm而言,是在worker程序accept一個請求且取得、解析完請求資料後的一個階段。此階段的處理函數為php_request_startup()。

主要處理有以下幾個:

(1)啟動輸出:php_output_activate()

(2)啟動Zend引擎:zend_activate(),主要操作有

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

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

     (2.3)執行器:ini_exutor( EG(function_table)和EG(class_table)分別執行CG(function_table)和CG(class_table)。

      (2.4)初始化全域變數符號表EG(symbol_table)、include過的檔案符號表EG(included_files)

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

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

 

(3)啟動SAPI:sapi_activate()

(4)回呼個擴充定義的request startup鉤子函數:zend_activate_modules()
#4、腳本執行階段—分析

(1)這個階段包含PHP程式碼的編譯、執行兩個核心階段,這也是Zend引擎最重要的功能。

(2)在編譯階段,PHP腳本將經歷從PHP原始碼到抽象語法樹,再到opline指令的轉換過程,最終產生的opline指令就是Zend引擎可辨識的執行指令,這些指令被執行器執行,這就是PHP程式碼解釋執行的過程。此階段入口函數為php_execute_script()。

5、請求關閉階段—分析

(1)該階段將flush輸出內容、發送HTTP應答header頭、清理局部變數、關閉編譯器、關閉執行器等。

(2)另外,在該階段將回呼各擴展的request shutdown鉤子函數。

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

6、模組關閉階段—分析

此階段在SAPI關閉時執行,與模組初始化階段對應,主要進行資源的清理、PHP各模組的關閉操作,同時將回呼各擴展的module shutdown 鉤子函數。 推薦學習:

php影片教學

 

### ###

以上是PHP的構成是什麼?生命週期是怎樣的?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:csdn.net
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板