PHP核心分析之生命週期(三)

2021-10-01 16:12:44 字數 2332 閱讀 2477

php生命週期有五個階段,分別為模組初始化階段、請求初始化階段、執行階段、請求關閉階段、模組關閉階段。只是不同sapi模式下,請求的情況略有不同,比如fastcgi下只經歷了一次模組初始化階段,接下來所有請求只經歷請求初始化、執行指令碼、請求關閉階段。

在初步了解生命週期的五個階段之後,我們先來講述在進入模組初始化階段(php_module_startup)之前php所做的工作(本文繼續以php7.4.1版本的cli模式)。

cli模式下的入口檔案是sapi/cli/php_cli.c,開啟該檔案,定位到主函式main,有沒有覺得1174行出現的結構體sapi_module_struct很眼熟?這就是上篇文章sapi的介紹中提到到結構體,它是擴充套件php對外服務的關鍵。

sapi_module_struct *sapi_module = &cli_sapi_module;
先來看一下sapi_module_structmain/sapi.h中的定義:

//main/sapi.h

struct _sapi_module_struct

sapi下的每乙個模式都實現了該結構體,比如在cli中:

//sapi/cli/php_cli.c

static sapi_module_struct cli_sapi_module =

fpm中:

//sapi/fpm/fpm/fpm_main.c

static sapi_module_struct cgi_sapi_module =

在litespeed中也有相同定義:

//sapi/litespeed/lsapi_main.c

static sapi_module_struct lsapi_sapi_module =

我們繼續往下看,在經過一系列變數的初始化後,於1297行又呼叫了sapi_startup函式。

//sapi/cli/php_cli.c

sapi_startup(sapi_module);

該函式定義了sapi_globals_struct,也就是我們常說的sg巨集,它的主要作用是儲存請求的基本資訊,比如伺服器資訊、header、編碼等。

//main/sapi.h

typedef struct _sapi_globals_struct sapi_globals_struct;

我們繼續往下看,sapi_module呼叫了startup函式:

//sapi/cli/php_cli.c

if (sapi_module->startup(sapi_module) == failure)

然後又呼叫了cli在sapi_module_struct中定義的startup對應的鉤子函式php_cli_startup

//sapi/cli/php_cli.c

static sapi_module_struct cli_sapi_module =

繼續跟進,php_cli_startup函式中又呼叫了php_module_startup函式:

//sapi/cli/php_cli.c

static int php_cli_startup(sapi_module_struct *sapi_module) /*

return success;

}

是不是很眼熟,這不就是模組初始化階段的函式嘛!原來執行了這麼久才到我們的關鍵點,模組初始化階段內容比較多,我們通過下一章進行詳細剖析。

//main/main.c

int php_module_startup(sapi_module_struct *sf, zend_module_entry *additional_modules, uint num_additional_modules)

注意:我在本文貼出的**都標識了檔案位置,我們可以看出來,在php五大生命週期開始之前一直都是在sapi目錄中執行的,而從php_module_struct也就是模組初始化階段開始,才執行到了main目錄,這意味著php的生命週期的第乙個階段是從main目錄下開始的。

PHP生命週期

2015 08 19 15 05 30 週三 一篇很好的文章 php核心探索 總結一下 1.模組初始化 minit 各個php模組 擴充套件初始化內部變數,告訴php呼叫自己的函式時,函式體在 到php那裡去註冊自己的函式 2.請求初始化 rinit 初始化session,全域性變數.等只針對當前請...

PHP生命週期

2015 08 19 15 05 30 週三 一篇很好的文章 php核心探索 總結一下 1.模組初始化 minit 各個php模組 擴充套件初始化內部變數,告訴php呼叫自己的函式時,函式體在 到php那裡去註冊自己的函式 2.請求初始化 rinit 初始化session,全域性變數.等只針對當前請...

Vue之生命週期和生命週期鉤子

生命週期 指的是vm例項建立 執行 銷毀期間的各種事件。生命週期鉤子 生命週期事件 生命週期函式。生命週期主要分為三類 1.建立 這些函式均只在建立階段執行一次 beforecreate 此階段vm例項在內存在建立出來 只有預設的生命週期函式和一些預設的事件 但是data和method屬性沒有初始化...