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頁面的請求告一段落。