進程管理是PHP-FPM優化的核心,直接影響并發處理能力和資源利用率。
dynamic
模式(動態調整進程數),可根據負載自動增減進程,適合大多數高并發場景;若服務器長期處于低負載,可使用ondemand
模式(按需啟動進程),進一步節省資源。pm.max_children
:根據服務器內存和CPU計算最大進程數(公式:(總內存 - 系統預留內存) / 單個進程內存占用
,如16GB內存、每個PHP進程占用100MB,則建議設置為150-160
)。pm.start_servers
:啟動時的初始進程數,建議設置為pm.max_children
的1/4-1/2(如pm.max_children=50
,則設置為10-25
)。pm.min_spare_servers
/pm.max_spare_servers
:空閑進程的最小/最大數量,確保負載突增時有足夠進程處理請求(如pm.min_spare_servers=5
、pm.max_spare_servers=30
)。pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 30
合理的內存配置可避免進程因內存不足被系統殺死,提升穩定性。
memory_limit
設置每個PHP進程的最大內存(如128M
或256M
,根據應用需求調整,避免設置過大導致內存溢出)。pm.max_requests
設置每個進程處理的最大請求數(如500-1000
),定期重啟進程可釋放潛在的內存泄漏,防止內存碎片積累。OPcache是PHP內置的操作碼緩存,可緩存編譯后的PHP腳本,減少重復編譯時間,顯著提升腳本執行速度。
opcache.enable=1
:開啟OPcache。opcache.memory_consumption=128
:分配給OPcache的內存大?。ㄈ?code>128M,根據服務器內存調整)。opcache.interned_strings_buffer=8
:優化字符串存儲的內存緩沖區大小。opcache.max_accelerated_files=4000
:允許緩存的腳本文件數量(需大于項目中PHP文件總數)。opcache.revalidate_freq=60
:腳本更新后重新驗證的時間間隔(單位:秒,如60
秒)。php.ini
):[opcache]
zend_extension=opcache.so
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
優化Nginx與PHP-FPM的通信可減少數據傳輸延遲,提升整體響應速度。
fastcgi_buffers
和fastcgi_buffer_size
調整緩沖區大?。ㄈ?code>fastcgi_buffers 8 16k;表示8個16KB的緩沖區,fastcgi_buffer_size 32k;
表示緩沖區大小為32KB),避免頻繁的磁盤I/O。fastcgi_read_timeout
設置讀取PHP-FPM響應的超時時間(如30s
或60s
,根據腳本執行時間調整,避免長時間等待)。location ~ \.php$
塊):location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_buffers 8 16k;
fastcgi_buffer_size 32k;
fastcgi_read_timeout 30s;
}
慢查詢日志可記錄執行時間過長的PHP腳本,幫助開發者快速定位性能問題。
slowlog
:設置慢查詢日志文件路徑(如/var/log/php-fpm/www-slow.log
)。request_slowlog_timeout
:設置慢查詢的閾值(如5s
,表示執行時間超過5秒的腳本會被記錄)。www.conf
):slowlog = /var/log/php-fpm/www-slow.log
request_slowlog_timeout = 5s
通過監控工具實時跟蹤PHP-FPM的性能指標,及時調整配置以適應流量變化。
pm.status_path = /status
),通過Nginx訪問http://服務器IP/status
查看進程數、請求處理時間等指標(需配置Nginx權限)。pm.max_children
設置是否合理,是否存在內存瓶頸)。notice
(log_level = notice
),減少不必要的日志輸出,降低磁盤I/O。catch_workers_output = yes
,將子進程的輸出重定向到錯誤日志,便于排查腳本問題。www-data
)與Nginx用戶一致,避免權限問題導致的性能損耗。