PHP-FPM的進程管理模式直接決定并發處理能力,需根據業務場景選擇:
pm.max_children = (總內存 - 系統預留內存 - 其他服務占用內存) ÷ 單個php-fpm進程內存
。例如16GB內存服務器,系統預留4GB、MySQL占用2GB,單個進程平均占用80MB,則pm.max_children = (16000-4000-2000)/80 = 125
(建議預留冗余,設置為120)。pm.start_servers
(初始進程數,建議CPU核心數×2)、pm.min_spare_servers
(最小空閑進程,建議CPU核心數)、pm.max_spare_servers
(最大空閑進程,建議CPU核心數×4)、pm.max_children
(需大于max_spare_servers
)、pm.process_idle_timeout
(空閑進程回收時間,10-30s)。例如4核8GB服務器:pm = dynamic; pm.max_children = 60; pm.start_servers = 8; pm.min_spare_servers = 4; pm.max_spare_servers = 16; pm.process_idle_timeout = 15s
。pm.max_children
為保守值(20-50),pm.process_idle_timeout
≥60s(減少重復創建開銷)。listen = /run/php-fpm/www.sock
;若需跨服務器則用TCP(listen = 127.0.0.1:9000
,禁止監聽0.0.0.0)。需同步調整內核參數net.core.somaxconn
(≥listen_backlog
,如均設為2048)。request_terminate_timeout
(強制終止超時腳本,避免阻塞)需根據業務類型區分:API接口設為10s,后臺任務設為60s;request_slowlog_timeout
(慢日志閾值,定位性能瓶頸)設為3s,記錄執行超過閾值的腳本及調用棧。OPcache通過緩存PHP編譯后的Opcode,可減少50%以上CPU消耗,必須啟用并精細化配置:
zend_extension=opcache.so; opcache.enable=1; opcache.memory_consumption=128
(緩存內存,建議≥64M);opcache.interned_strings_buffer=16
(字符串intern池,8-32M);opcache.max_accelerated_files=32768
(緩存文件數,根據項目文件數調整,如15000個文件設為32768)。opcache.validate_timestamps=0
),避免頻繁檢查文件變化;使用opcache.preload
(PHP 7.4+)預加載框架核心文件(如Laravel的helpers.php、BaseController.php)到內存,進一步提升性能。rlimit_files = 65535
)、系統級限制(/etc/security/limits.conf
添加* soft nofile 65535; * hard nofile 65535
)及systemd服務配置(LimitNOFILE=65535
)。memory_limit
(單個進程內存上限)需根據業務類型調整:普通Web請求設為128M,圖片處理、大數據導出等場景設為256M。fastcgi_pass unix:/run/php-fpm/www.sock;
,并設置fastcgi_buffer_size 128k; fastcgi_buffers 4 256k;
(調整緩沖區減少IO)。fastcgi_connect_timeout
(連接超時,3s)、fastcgi_send_timeout
(發送超時,≥php-fpm的request_terminate_timeout
)、fastcgi_read_timeout
(讀取超時,同上)。pm.status_path = /php-fpm-status
),通過Nginx配置訪問權限(allow 127.0.0.1; deny all;
),訪問http://127.0.0.1/php-fpm-status?full
獲取活躍進程數、監聽隊列長度等指標。phpfpm_active_processes
(活躍進程數)、phpfpm_listen_queue_length
(監聽隊列長度)等指標,設置閾值告警(如活躍進程數>80%×pm.max_children
、監聽隊列長度>100持續5分鐘)。wrk -t4 -c100 -d30s http://domain/test.php
),對比優化前后的QPS(如從200提升至500)、平均響應時間(如從500ms降至150ms),驗證優化效果。systemctl status php-fpm
)、socket權限(ls -l /run/php-fpm/www.sock
,確保Nginx用戶有權限)、pm.max_children
是否耗盡(查看max children reached
日志)。request_terminate_timeout
和Nginx的fastcgi_read_timeout
(如均設為15s)。slow.log
提取慢腳本(cat slow.log | grep "script_filename" | sort | uniq -c | sort -nr | head -10
),使用EXPLAIN
分析SQL(是否缺少索引),優化代碼(減少循環嵌套、批量操作替代逐條處理)。