中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

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

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

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

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接口,模塊初始化階段

SAPI是什么?

Server Application Programming Interface 服務端應用編程接口

這是 PHP 內核提供給外部調用其服務的接口,即外部系統可以通過 SAPI 來調用 PHP 提供的編譯腳本、執行腳本的服務。

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

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

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

在使用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 進程的生命周期如下圖:

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

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

當一個請求發生時,在處理請求前需要經歷的一個階段 :

  1. Nginx 解析一個請求

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

  3. Nginx 的 fast-cgi 模塊會遵循 fast-cgi協議 將這個請求轉發給 proxy_pass 指定的上游服務:php-fpm

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


第三階段:php腳本執行階段

php代碼解析執行的過程,Zend引擎接管控制權。

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

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

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

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


第四階段:請求結束階段

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

  1. 執行flush,輸出響應內容

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

  3. worker進程關閉該請求連接,繼續等待 accept下一個請求。

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

向AI問一下細節

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

php
AI

三河市| 邵武市| 焉耆| 河曲县| 遂川县| 新田县| 会泽县| 彭阳县| 博野县| 岫岩| 五指山市| 桐柏县| 辉南县| 安龙县| 瑞安市| 桐梓县| 余姚市| 子洲县| 杭州市| 泰顺县| 民权县| 贡觉县| 沙湾县| 郎溪县| 梅河口市| 宁蒗| 九龙城区| 四子王旗| 宣武区| 东乡族自治县| 安远县| 广水市| 邵阳市| 永春县| 南涧| 晋宁县| 兰考县| 章丘市| 迁安市| 南阳市| 陆良县|