1. 优化PHP-FPM进程管理配置
进程管理是PHP-FPM性能调优的核心,需根据服务器负载类型选择模式并调整参数:
pm.max_children:根据服务器内存和单个PHP进程内存(如memory_limit设为128M~256M)计算,公式为(总内存 - 系统预留内存) / 单个进程内存,避免进程数过多导致内存耗尽。pm.start_servers:设置为CPU核心数的2~4倍(如4核CPU设为8~16),保证启动时有足够进程处理初始请求。pm.min_spare_servers/pm.max_spare_servers:分别设置为CPU核心数的1~2倍和2~4倍(如4核CPU设为4~8),维持空闲进程池,避免频繁创建/销毁进程的开销。pm.max_requests:设为500~1000,限制单个进程处理的请求数,防止内存泄漏累积(如脚本存在内存泄漏,重启进程可释放内存)。2. 启用并优化OPcache加速PHP执行
OPcache通过缓存编译后的PHP字节码,减少重复解析和编译的开销,显著提升性能:
sudo apt install php-opcache安装,编辑php.ini取消以下注释并调整参数:zend_extension=opcache.so
opcache.enable=1
opcache.memory_consumption=128 # 缓存内存大小(MB),根据应用复杂度调整(如128~256MB)
opcache.interned_strings_buffer=8 # 内部字符串缓存大小(MB)
opcache.max_accelerated_files=4000 # 缓存的文件数量(需大于应用包含的文件数)
opcache.revalidate_freq=60 # 文件修改检查频率(秒),生产环境可设为0(禁用检查)或更高(如3600)
opcache.fast_shutdown=1 # 快速关闭,减少进程结束时的清理时间
php -i | grep opcache确认opcache.enable为On。3. 调整PHP-FPM请求处理参数
合理设置请求处理参数,避免资源浪费和长时间阻塞:
request_terminate_timeout:设置脚本最大执行时间(如30s),防止恶意或错误脚本无限运行占用进程(如上传大文件或死循环脚本)。slowlog与request_slowlog_timeout:开启慢日志定位性能瓶颈,例如:slowlog = /var/log/php-fpm/www-slow.log
request_slowlog_timeout = 5s # 记录执行超过5秒的请求
日志路径需确保PHP-FPM进程有写入权限(如chown www-data:www-data /var/log/php-fpm/www-slow.log)。4. 优化系统资源限制
调整系统参数,提升PHP-FPM处理高并发的能力:
ulimit -n 65535临时设置,永久生效需修改/etc/security/limits.conf(添加www-data hard nofile 65535和www-data soft nofile 65535,www-data为PHP-FPM运行用户)。/etc/sysctl.conf,添加以下参数提升网络性能:net.core.somaxconn = 65535 # 监听队列最大长度
net.ipv4.tcp_max_syn_backlog = 65535 # SYN队列最大长度
net.ipv4.ip_local_port_range = 1024 65535 # 本地端口范围
执行sysctl -p使配置生效。5. 监控与日志分析性能瓶颈
定期监控PHP-FPM状态,通过日志定位问题:
www.conf)中开启pm.status_path = /status,通过Nginx/Apache配置访问(如location /status { fastcgi_pass unix:/run/php/php8.1-fpm.sock; }),通过浏览器或curl查看进程数、空闲进程数等指标。grep或工具(如pt-query-digest)分析slowlog,找出执行慢的脚本(如SELECT * FROM large_table未优化查询),针对性优化代码或数据库。6. 优化代码与数据库交互
代码层面的优化能从根本上减少PHP-FPM的负载:
include,降低文件IO次数。SELECT * FROM users WHERE id=1的结果缓存10分钟)。SELECT *(只查询需要的字段),使用预处理语句防止SQL注入,减少数据库响应时间。7. 选择合适的监听方式
根据部署环境选择Unix Socket或TCP Socket:
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location ~ \.php$ {
fastcgi_pass 192.168.1.100:9000; # PHP-FPM服务器IP和端口
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
需确保防火墙开放对应端口(如ufw allow 9000/tcp)。