一:首先介紹PHP-FPM 的三種模式
首先看php配置文件中的說明。
(1)pm=static
始終保持固定數量的worker進程數,由pm.max_children決定,不會動態擴容。
配置項要求
1、pm.max_children> 0 必須配置,且只有這一個參數生效
優缺點
如果配置成static,只需要考慮max_children的數量,數量取決於cpu的個數和應用的響應時間,
(2)pm=dynamic
php-fpm啟動時,會初始啟動一些worker,初始啟動worker數決定於pm.max_children的值。在運行過程中動態調整worker數量,worker的數量受限於pm.max_children配置,同時受限全局配置process.max。
1秒定時器作用,檢查空閑worker數量,按照一定策略動態調整worker數量,增加或減少。增加時,worker最大數量<=max_children· <=全局process.max;減少時,只有idle >pm.max_spare_servers時才會關閉一個空閑worker。
優缺點
優點:動態擴容,不浪費系統資源
缺點:如果所有worker都在工作,新的請求到來只能等待master在1秒定時器內再新建一個worker,這時可能最長等待1s
(3)pm=ondemand
php-fpm啟動的時候,不會啟動任何一個worker,而是按需啟動,只有當連接過來的時候才會啟動。
啟動的最大worker數決定於pm.max_children的值,同時受限全局配置process.max。
1秒定時器作用,如果空閑worker時間超過pm.process_idle_timeout的值(默認值為10s),則關閉該worker。這個機制可能會關閉所有的worker。
優缺點
優點:按流量需求創建,不浪費系統資源
缺點:由於php-fpm是短連接的,所以每次請求都會先建立連接,頻繁的創建worker會浪費系統開銷。,所以,在大流量的系統上,master進程會變得繁忙,占用系統cpu資源,不適合大流量環境的部署。
pm模式設置在/etc/php-fpm.d文件中
可以看到php7.0的默認pm值為dynamic,pm.max_children值為5
一個master進程,2個worker進程
worker進程、master進程詳解
master只是負責監聽管理工作,並不是很多人認為的把客戶端發來的請求分給worker進程處理,而是由worker進程負責客戶端的請求監聽和處理
可以看到一旦kill掉worker進程后,會重啟一個新的worker進程。因此客戶端請求肯定會得到響應處理。master進程負責監聽子進程的狀態,子進程掛掉之后,會發信號給master進程,然后master進程重新啟一個新的worker進程。