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(是否缺少索引),优化代码(减少循环嵌套、批量操作替代逐条处理)。