新聞中心
這篇文章給大家介紹PHP中請求的生命周期有哪些,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、微信小程序定制開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了平陰免費建站歡迎大家使用!
PHP的運行模式
1.cli:命令行模式
2.CGI(common gateway interface): 公共網(wǎng)關(guān)接口
當(dāng)一個服務(wù)web-service(nginx)分配過來請求的時候,通過匹配后綴是動態(tài)的php的請求。CGI就會去讀取php.ini的基本配置信息,初始化環(huán)境,創(chuàng)建進(jìn)程,返回數(shù)據(jù),退出進(jìn)程。每一次請求都是循環(huán)往復(fù),所以有些繁瑣,這是后面為什么會誕生fastcgi的原因。
3. fastcgi (fast cgi): cgi的改進(jìn)版
3.1當(dāng)web服務(wù)器啟動時載入fastcgi管理器。
3.2.fastcgi自動初始化,創(chuàng)建fastcgi主進(jìn)程和多個cgi解析器進(jìn)程,等待來著web服務(wù)器的請求(只初始化一次,還有個好處,數(shù)據(jù)庫可以持續(xù)化連接)。
3.3當(dāng)請求web服務(wù)器時,通過匹配后綴是動態(tài)的php請求,web服務(wù)器通過socket請求fastcgi進(jìn)程管理器,fastcgi進(jìn)程管理器,選擇一個cgi解析器,web服務(wù)器將cgi環(huán)境變量和標(biāo)準(zhǔn)輸入發(fā)送fastcgi子進(jìn)程php-cgi.
3.4fastcgi子進(jìn)程處理完后將標(biāo)準(zhǔn)的輸出和錯誤從同一個連接返回給web服務(wù)器,當(dāng)fastcgi子進(jìn)程結(jié)束后請求就結(jié)束了,fastcgi子進(jìn)程接著等待處理來自fastcgi進(jìn)程管理器的下一個連接,在CGI模式中,php-cgi.在此便退出了。
4. mod_php:
即Apache運行PHP的默認(rèn)方式,將PHP作為web服務(wù)器的子進(jìn)程控制,mod_php模式運行PHP,意味著PHP是作為Apache的一個模塊來啟動的,因此只有在Apache啟動的時候會讀取php.ini配置文件并加載擴(kuò)展模塊,在Apache運行期間是不會再去讀取和加載擴(kuò)展模塊的
PHP現(xiàn)在流行的兩種運行模式是FPM模式、CLI模式。
PHP腳本執(zhí)行的開始,都是通過SAPI接口進(jìn)行的
第一階段:SAPI接口,模塊初始化階段
SAPI是什么?
Server Application Programming Interface 服務(wù)端應(yīng)用編程接口
這是 PHP 內(nèi)核提供給外部調(diào)用其服務(wù)的接口,即外部系統(tǒng)可以通過 SAPI 來調(diào)用 PHP 提供的編譯腳本、執(zhí)行腳本的服務(wù)。
SAPI提供給了外部應(yīng)用跟php通信的管道,這個外部應(yīng)用包括不限于Apache,httpd,liunx終端等
PHP 中實現(xiàn)的 SAPI 有很多,CLI、FPM 是我們比較常見的。
![]()
在使用Apache作為Web服務(wù)器的時候:
PHP總是作為Apache的模塊,隨著Apache的啟動而運行的。
當(dāng)給定的SAPI啟動時,PHP進(jìn)入初始化內(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),并提供了進(jìn)程管理的功能。
對于php-fpm而言,就是在master進(jìn)程啟動時執(zhí)行,加載PHP拓展,并調(diào)用模塊初始化例程 MINIT , 這使得每個擴(kuò)展可以初始化內(nèi)部變量、分配資源、注冊資源處理器,以及向zend注冊自己的函數(shù),以便于腳本調(diào)用這其中的函數(shù)時候zend知道執(zhí)行哪些代碼。再預(yù)先fork 多個 worker 進(jìn)程,accept請求并執(zhí)行。
worder 進(jìn)程的生命周期如下圖:
![]()
第二階段:請求初始化階段
當(dāng)一個請求發(fā)生時,在處理請求前需要經(jīng)歷的一個階段 :
Nginx 解析一個請求
當(dāng)符合php腳本請求的規(guī)則的時候,會把這個請求交給反向代理中的fast-cgi模塊
Nginx 的 fast-cgi 模塊會遵循 fast-cgi協(xié)議 將這個請求轉(zhuǎn)發(fā)給 proxy_pass 指定的上游服務(wù):php-fpm
SAPI層將控制權(quán)交給PHP層。于是PHP設(shè)置了用于回復(fù)本次請求所需的環(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ǔn)備過程, 在程序執(zhí)行之間就會自動啟動。
第三階段:php腳本執(zhí)行階段
php代碼解析執(zhí)行的過程,Zend引擎接管控制權(quán)。
Scanning(Lexing) ,將PHP代碼轉(zhuǎn)換為語言片段(Tokens) (掃描–語言片段)
Parsing, 將Tokens轉(zhuǎn)換成簡單而有意義的表達(dá)式(解析–表達(dá)式)
Compilation, 將表達(dá)式編譯成Opocdes(編碼-opcodes)
Execution, 順次執(zhí)行Opcodes,每次一條,從而實現(xiàn)PHP腳本的功能。(執(zhí)行opcodes)
第四階段:請求結(jié)束階段
請求處理完成后,就進(jìn)入了 結(jié)束階段。
執(zhí)行flush,輸出響應(yīng)內(nèi)容
PHP啟動清理程序,它會按順序調(diào)用各個模塊的RSHUTDOWN方法。 RSHUTDOWN用以清除程序運行時產(chǎn)生的符號表,執(zhí)行垃圾清理過程,也就是對每個變量調(diào)用unset函數(shù)。
worker進(jìn)程關(guān)閉該請求連接,繼續(xù)等待 accept下一個請求。
關(guān)于PHP中請求的生命周期有哪些就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
文章題目:PHP中請求的生命周期有哪些
網(wǎng)站路徑:http://www.dlmjj.cn/article/jepggj.html