PHP-FPM進程模型詳解

語言: CN / TW / HK

本文將介紹以下內容:

  • PHP-FPM進程管理方式介紹
  • PHP-FPM如何與Nginx等Web服務器進行通信

先説一下PHP-FPM的進程模型,PHP-FPM採用的是Master/Worker進程模型。當PHP-FPM啟動時,會讀取配置文件,然後創建一個Master進程和若干個Worker進程(具體是幾個Worker進程是由php-fpm.conf中配置的個數決定)。Worker進程是由Master進程fork出來的。

Master進程和Worker進程的作用:

  • Master進程:負責管理Worker進程、監聽端口
  • Worker進程:處理業務邏輯

PHP-FPM進程管理方式有動態(Dynamic)、靜態(Static)、按需(Ondemand)三種,下面將一一介紹。

動態(Dynamic) 在這種方式下,PHP-FPM啟動時會創建一定數量的Worker進程。當請求數逐漸增大時,會動態增加Worker進程的數量;當請求數降下來時,會銷燬剛才動態創建出來的Worker進程。在這種方式下,如果配置的最大進程數過大,當請求量增加時會出現大量Worker進程,進程之間會頻繁切換,浪費大量CPU資源。

下面的三個參數可以配置Worker進程的數量:

  • pm.start_servers:動態方式下的起始php-fpm進程數量。
  • pm.min_spare_servers:動態方式下的最小php-fpm進程數量。
  • pm.max_spare_servers:動態方式下的最大php-fpm進程數量。

靜態(Static) 這種方式下,PHP-FPM啟動時會創建配置文件中指定數量的Worker進程,不會根據請求數量的多少而增加減少。因為PHP-FPM開啟的每個Worker進程同一時間只能處理一個請求,所以在這種方式下當請求增大的時候,將會出現等待的情形。

下面的參數可以配置Worker進程的數量: pm.max_children:靜態方式下開啟的php-fpm進程數量。

按需(Ondemand) 在這種方式下,PHP-FPM啟動時,不會創建Worker進程,當請求到達的時候Master進程才會fork出子進程。在這種模式下,如果請求量比較大,Master進程會非常繁忙,會佔用大量CPU時間。所以這種模式不適合大流量的環境。

 

在Nginx+PHP-FPM的架構中,Web服務器是如何與PHP-FPM通信的呢?

當用户請求一個http地址時,Nginx會收到請求,然後將請求轉發給PHP-FPM,PHP-FPM收到請求後會將請求轉發給一個空閒的Worker進程。當Worker進程處理完後會將結果返回給Nginx,Ngixn再講內容返回給用户。

以上內容希望幫助到大家,很多PHPer在進階的時候總會遇到一些問題和瓶頸,業務代碼寫多了沒有方向感,更多PHP大廠PDF面試文檔,PHP進階架構視頻資料,PHP精彩好文免費獲取可以關注公眾號:PHP開源社區,或者訪問:

2021金三銀四大廠面試真題集錦,必看!

四年精華PHP技術文章整理合集——PHP框架篇

四年精華PHP技術文合集——微服務架構篇

四年精華PHP技術文合集——分佈式架構篇

四年精華PHP技術文合集——高併發場景篇

四年精華PHP技術文章整理合集——數據庫篇