php學習筆記(三):一次php請求過程


1. 搭建環境:

(1) 本機虛擬機地址192.168.100.142。虛擬機中啟動nginx容器,php-fpm容器,mysql容器,均監聽默認的端口;

(2) nginx容器配置文件中通過proxy_pass將php請求轉發到php-fpm監聽的9000端口;

(3) 為實驗項目配置域名my.test.com,項目目錄設定為/{rootPath}/yii/frontend/web(這是一個yii-advanced項目),並配置rewrite將訪問重定向到項目目錄下的index.php;

(4) 配置本機hosts文件以便通過域名訪問本地項目(192.168.100.142 my.test.com)。

 2. 一次php請求過程圖解:

 

3. 一個php頁面的請求過程說明

(1) 在本機瀏覽器中輸入網址:my.test.com,請求被發送到hosts文件指定的192.168.100.142:80,即我本機虛擬機的80端口;

(2) 監聽192.168.100.142:80的nginx接收到此次請求,由於這是一次Http請求,所以nginx的核心模塊會把它交給Http模塊來選擇合適的Handler模塊。

(3) 經過請求初始化與請求解析,確定請求/{rootPath}/yii/frontend/web/index.php頁面的內容。由於這是一個php的請求,nginx會把此次請求交由反向代理模塊中的fast-cgi模塊,因為nginx不能直接和php通信,他們之間要通過fast-cgi協議才能相互理解。而nginx的fast-cgi模塊會遵循fast-cgi協議將請求相關信息發送給proxy_pass指定的fast-cgi上游服務,這里就是指php-fpm;

(4) 這個php-fpm是php這一端遵循fast-cgi協議與web server進行通信的服務,這樣請求就到了php這一邊。

(5) php-fpm master管理着多個php-fpm worker進程,一次請求到來時它們通過搶奪accept鎖的方式獲得這次請求的執行權。然后由這個php-fpm worker開始執行這一次請求。

(6) 經過一系列的初始化后,由zend引擎對被請求的index.php頁面內容進行詞法分析和語法分析,生成可以由zend引擎執行的opcode,然后按順序執行這些opcode,
執行完畢后會進行一系列請求關閉的工作,然后將處理結果反饋給fast-cgi的下游web server;

(5) nginx的fast-cgi模塊拿到處理結果后,將結果交由一系列Filter模塊進行響應內容的過濾與封裝,最終反饋到請求終端。

至此,一次php頁面的請求告一段落。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM