溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

PHP中請求的生命周期有哪些

發(fā)布時間:2021-06-22 17:40:37 來源:億速云 閱讀:177 作者:Leah 欄目:編程語言

這篇文章給大家介紹PHP中請求的生命周期有哪些,內(nèi)容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

PHP的運行模式

1.cli:命令行模式

2.CGI(common gateway interface): 公共網(wǎng)關(guān)接口

   當一個服務(wù)web-service(nginx)分配過來請求的時候,通過匹配后綴是動態(tài)的php的請求。CGI就會去讀取php.ini的基本配置信息,初始化環(huán)境,創(chuàng)建進程,返回數(shù)據(jù),退出進程。每一次請求都是循環(huán)往復,所以有些繁瑣,這是后面為什么會誕生fastcgi的原因。

3. fastcgi (fast cgi): cgi的改進版

   3.1當web服務(wù)器啟動時載入fastcgi管理器。

   3.2.fastcgi自動初始化,創(chuàng)建fastcgi主進程和多個cgi解析器進程,等待來著web服務(wù)器的請求(只初始化一次,還有個好處,數(shù)據(jù)庫可以持續(xù)化連接)。

   3.3當請求web服務(wù)器時,通過匹配后綴是動態(tài)的php請求,web服務(wù)器通過socket請求fastcgi進程管理器,fastcgi進程管理器,選擇一個cgi解析器,web服務(wù)器將cgi環(huán)境變量和標準輸入發(fā)送fastcgi子進程php-cgi.

 3.4fastcgi子進程處理完后將標準的輸出和錯誤從同一個連接返回給web服務(wù)器,當fastcgi子進程結(jié)束后請求就結(jié)束了,fastcgi子進程接著等待處理來自fastcgi進程管理器的下一個連接,在CGI模式中,php-cgi.在此便退出了。

4. mod_php:

即Apache運行PHP的默認方式,將PHP作為web服務(wù)器的子進程控制,mod_php模式運行PHP,意味著PHP是作為Apache的一個模塊來啟動的,因此只有在Apache啟動的時候會讀取php.ini配置文件并加載擴展模塊,在Apache運行期間是不會再去讀取和加載擴展模塊的

PHP現(xiàn)在流行的兩種運行模式是FPM模式、CLI模式。

PHP腳本執(zhí)行的開始,都是通過SAPI接口進行的


第一階段:SAPI接口,模塊初始化階段

SAPI是什么?

Server Application Programming Interface 服務(wù)端應用編程接口

這是 PHP 內(nèi)核提供給外部調(diào)用其服務(wù)的接口,即外部系統(tǒng)可以通過 SAPI 來調(diào)用 PHP 提供的編譯腳本、執(zhí)行腳本的服務(wù)。

SAPI提供給了外部應用跟php通信的管道,這個外部應用包括不限于Apache,httpd,liunx終端等

PHP 中實現(xiàn)的 SAPI 有很多,CLI、FPM 是我們比較常見的。

PHP中請求的生命周期有哪些

在使用Apache作為Web服務(wù)器的時候:

PHP總是作為Apache的模塊,隨著Apache的啟動而運行的。

當給定的SAPI啟動時,PHP進入初始化內(nèi)核子系統(tǒng),主要對PHP框架,zend引擎的初始化操作,這個階段一般是在SAPI啟動時執(zhí)行一次。

在使用Nginx作為Web服務(wù)器的時候:

因為Nginx不能直接和PHP通信,所以他們之間要通過 fast-cgi 協(xié)議才能互相理解。

php-fpm 即 php-Fastcgi Process Manager,是 FastCGI 的實現(xiàn),并提供了進程管理的功能。

對于php-fpm而言,就是在master進程啟動時執(zhí)行,加載PHP拓展,并調(diào)用模塊初始化例程 MINIT , 這使得每個擴展可以初始化內(nèi)部變量、分配資源、注冊資源處理器,以及向zend注冊自己的函數(shù),以便于腳本調(diào)用這其中的函數(shù)時候zend知道執(zhí)行哪些代碼。再預先fork 多個 worker 進程,accept請求并執(zhí)行。

worder 進程的生命周期如下圖:

PHP中請求的生命周期有哪些

第二階段:請求初始化階段

當一個請求發(fā)生時,在處理請求前需要經(jīng)歷的一個階段 :

  1. Nginx 解析一個請求

  2. 當符合php腳本請求的規(guī)則的時候,會把這個請求交給反向代理中的fast-cgi模塊

  3. Nginx 的 fast-cgi 模塊會遵循 fast-cgi協(xié)議 將這個請求轉(zhuǎn)發(fā)給 proxy_pass 指定的上游服務(wù):php-fpm

  4. SAPI層將控制權(quán)交給PHP層。于是PHP設(shè)置了用于回復本次請求所需的環(huán)境變量。同時,它還建立一個變量表,用來存放執(zhí)行過程 中產(chǎn)生的變量名和值。PHP調(diào)用各個模塊的RINIT方法,即“請求初始化”。一個經(jīng)典的例子是Session模塊的RINIT,如果在php.ini中 啟用了Session模塊,那在調(diào)用該模塊的RINIT時就會初始化$_SESSION變量,并將相關(guān)內(nèi)容讀入;RINIT方法可以看作是一個準備過程, 在程序執(zhí)行之間就會自動啟動。


第三階段:php腳本執(zhí)行階段

php代碼解析執(zhí)行的過程,Zend引擎接管控制權(quán)。

  1. Scanning(Lexing) ,將PHP代碼轉(zhuǎn)換為語言片段(Tokens) (掃描–語言片段)

  2. Parsing, 將Tokens轉(zhuǎn)換成簡單而有意義的表達式(解析–表達式)

  3. Compilation, 將表達式編譯成Opocdes(編碼-opcodes)

  4. Execution, 順次執(zhí)行Opcodes,每次一條,從而實現(xiàn)PHP腳本的功能。(執(zhí)行opcodes)


第四階段:請求結(jié)束階段

請求處理完成后,就進入了 結(jié)束階段。

  1. 執(zhí)行flush,輸出響應內(nèi)容

  2. PHP啟動清理程序,它會按順序調(diào)用各個模塊的RSHUTDOWN方法。 RSHUTDOWN用以清除程序運行時產(chǎn)生的符號表,執(zhí)行垃圾清理過程,也就是對每個變量調(diào)用unset函數(shù)。

  3. worker進程關(guān)閉該請求連接,繼續(xù)等待 accept下一個請求。

關(guān)于PHP中請求的生命周期有哪些就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI