您好,登錄后才能下訂單哦!
這篇文章給大家介紹PHP中請求的生命周期有哪些,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
1.cli:命令行模式
2.CGI(common gateway interface): 公共網關接口
當一個服務web-service(nginx)分配過來請求的時候,通過匹配后綴是動態的php的請求。CGI就會去讀取php.ini的基本配置信息,初始化環境,創建進程,返回數據,退出進程。每一次請求都是循環往復,所以有些繁瑣,這是后面為什么會誕生fastcgi的原因。
3. fastcgi (fast cgi): cgi的改進版
3.1當web服務器啟動時載入fastcgi管理器。
3.2.fastcgi自動初始化,創建fastcgi主進程和多個cgi解析器進程,等待來著web服務器的請求(只初始化一次,還有個好處,數據庫可以持續化連接)。
3.3當請求web服務器時,通過匹配后綴是動態的php請求,web服務器通過socket請求fastcgi進程管理器,fastcgi進程管理器,選擇一個cgi解析器,web服務器將cgi環境變量和標準輸入發送fastcgi子進程php-cgi.
3.4fastcgi子進程處理完后將標準的輸出和錯誤從同一個連接返回給web服務器,當fastcgi子進程結束后請求就結束了,fastcgi子進程接著等待處理來自fastcgi進程管理器的下一個連接,在CGI模式中,php-cgi.在此便退出了。
4. mod_php:
即Apache運行PHP的默認方式,將PHP作為web服務器的子進程控制,mod_php模式運行PHP,意味著PHP是作為Apache的一個模塊來啟動的,因此只有在Apache啟動的時候會讀取php.ini配置文件并加載擴展模塊,在Apache運行期間是不會再去讀取和加載擴展模塊的
PHP現在流行的兩種運行模式是FPM模式、CLI模式。
PHP腳本執行的開始,都是通過SAPI接口進行的
SAPI是什么?
Server Application Programming Interface 服務端應用編程接口
這是 PHP 內核提供給外部調用其服務的接口,即外部系統可以通過 SAPI 來調用 PHP 提供的編譯腳本、執行腳本的服務。
SAPI提供給了外部應用跟php通信的管道,這個外部應用包括不限于Apache,httpd,liunx終端等
PHP 中實現的 SAPI 有很多,CLI、FPM 是我們比較常見的。
在使用Apache作為Web服務器的時候:
PHP總是作為Apache的模塊,隨著Apache的啟動而運行的。
當給定的SAPI啟動時,PHP進入初始化內核子系統,主要對PHP框架,zend引擎的初始化操作,這個階段一般是在SAPI啟動時執行一次。
在使用Nginx作為Web服務器的時候:
因為Nginx不能直接和PHP通信,所以他們之間要通過 fast-cgi 協議才能互相理解。
php-fpm 即 php-Fastcgi Process Manager,是 FastCGI 的實現,并提供了進程管理的功能。
對于php-fpm而言,就是在master進程啟動時執行,加載PHP拓展,并調用模塊初始化例程 MINIT , 這使得每個擴展可以初始化內部變量、分配資源、注冊資源處理器,以及向zend注冊自己的函數,以便于腳本調用這其中的函數時候zend知道執行哪些代碼。再預先fork 多個 worker 進程,accept請求并執行。
worder 進程的生命周期如下圖:
當一個請求發生時,在處理請求前需要經歷的一個階段 :
Nginx 解析一個請求
當符合php腳本請求的規則的時候,會把這個請求交給反向代理中的fast-cgi模塊
Nginx 的 fast-cgi 模塊會遵循 fast-cgi協議 將這個請求轉發給 proxy_pass 指定的上游服務:php-fpm
SAPI層將控制權交給PHP層。于是PHP設置了用于回復本次請求所需的環境變量。同時,它還建立一個變量表,用來存放執行過程 中產生的變量名和值。PHP調用各個模塊的RINIT方法,即“請求初始化”。一個經典的例子是Session模塊的RINIT,如果在php.ini中 啟用了Session模塊,那在調用該模塊的RINIT時就會初始化$_SESSION變量,并將相關內容讀入;RINIT方法可以看作是一個準備過程, 在程序執行之間就會自動啟動。
php代碼解析執行的過程,Zend引擎接管控制權。
Scanning(Lexing) ,將PHP代碼轉換為語言片段(Tokens) (掃描–語言片段)
Parsing, 將Tokens轉換成簡單而有意義的表達式(解析–表達式)
Compilation, 將表達式編譯成Opocdes(編碼-opcodes)
Execution, 順次執行Opcodes,每次一條,從而實現PHP腳本的功能。(執行opcodes)
請求處理完成后,就進入了 結束階段。
執行flush,輸出響應內容
PHP啟動清理程序,它會按順序調用各個模塊的RSHUTDOWN方法。 RSHUTDOWN用以清除程序運行時產生的符號表,執行垃圾清理過程,也就是對每個變量調用unset函數。
worker進程關閉該請求連接,繼續等待 accept下一個請求。
關于PHP中請求的生命周期有哪些就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。