1. 调整PHP-FPM进程管理参数
进程管理是PHP-FPM性能优化的核心。需根据服务器资源(CPU核心数、内存)和负载特性选择模式:
pm.max_children),适合高并发且稳定的场景,避免频繁创建/销毁进程的开销。数值需根据内存计算(如每个PHP进程占用100MB内存,16GB内存服务器可设为160左右)。pm.start_servers(初始进程数,建议为pm.max_children的1/4~1/2)、pm.min_spare_servers(最小空闲进程数,保证突发请求时有足够进程)、pm.max_spare_servers(最大空闲进程数,避免资源浪费,建议为pm.max_children的1/2~3/4)。pm.process_idle_timeout(空闲进程超时时间,如10秒),超时后自动终止进程。pm.max_requests(每个子进程处理的最大请求数,如500)可防止内存泄漏,定期重启进程释放内存。2. 启用并优化OPcache加速
OPcache是PHP内置的字节码缓存扩展,可避免重复解析和编译PHP脚本,显著提升执行效率。需在php.ini中启用并调整参数:
zend_extension=opcache.so
opcache.enable=1
opcache.memory_consumption=128 # 缓存内存大小(MB),根据服务器内存调整(如16GB内存可设为128~256)
opcache.interned_strings_buffer=8 # 内部字符串缓存大小(MB)
opcache.max_accelerated_files=10000 # 最大加速文件数,需覆盖项目所有PHP文件
opcache.revalidate_freq=60 # 脚本验证频率(秒),设为0表示每次请求都验证(开发环境),生产环境建议60~300秒
opcache.fast_shutdown=1 # 快速关闭,释放内存更高效
启用后需重启PHP-FPM使配置生效。
3. 优化系统内核参数
调整Linux内核参数可提升PHP-FPM的I/O和网络性能:
fs.file-max)和用户级限制(ulimit -n),避免高并发时连接数超过限制。echo "fs.file-max = 100000" >> /etc/sysctl.conf
echo "ulimit -n 65535" >> /etc/security/limits.conf
sysctl -p # 使内核参数生效
net.core.somaxconn(socket最大连接数,如65535)、net.ipv4.tcp_max_syn_backlog(SYN队列长度,如65535)、net.ipv4.tcp_tw_reuse(TIME-WAIT连接复用,设为1)、net.ipv4.tcp_fin_timeout(FIN等待时间,如30秒),减少网络延迟。echo "net.core.somaxconn = 65535" >> /etc/sysctl.conf
echo "net.ipv4.tcp_max_syn_backlog = 65535" >> /etc/sysctl.conf
echo "net.ipv4.tcp_tw_reuse = 1" >> /etc/sysctl.conf
echo "net.ipv4.tcp_fin_timeout = 30" >> /etc/sysctl.conf
sysctl -p
vm.swappiness=10(默认60),降低系统使用交换分区的概率,提升内存访问速度。echo "vm.swappiness = 10" >> /etc/sysctl.conf
sysctl -p
4. 优化PHP配置
除OPcache外,还需调整以下PHP参数:
memory_limit(如128M~512M),避免大脚本因内存不足而终止。需根据应用需求调整,避免设置过高导致内存耗尽。max_execution_time(如30~300秒),根据脚本复杂度设置,避免长时间运行的脚本占用资源。upload_max_filesize(如10M~100M)和post_max_size(大于upload_max_filesize),避免上传失败。5. 使用持久连接减少连接开销
fastcgi_keep_conn on;),减少TCP握手和挥手开销。PDO::ATTR_PERSISTENT => true),避免频繁建立和断开数据库连接,提升数据库访问效率。6. 监控与分析性能瓶颈
使用工具持续监控PHP-FPM状态,定位性能瓶颈:
top、htop查看CPU、内存使用情况;vmstat 1查看系统级I/O、CPU、内存指标;ss -lntp | grep php-fpm查看PHP-FPM进程的连接状态。php-fpm.conf中启用pm.status_path = /status,通过Nginx/Apache配置访问该路径(如location /status { fastcgi_pass 127.0.0.1:9000; include fastcgi_params; }),查看进程数、请求处理时间、空闲进程数等详细信息。7. 代码与架构优化
include/require,减少I/O操作。SELECT *、合理设计表结构,减少数据库查询时间;使用连接池(如Swoole)提升数据库连接复用率。8. 负载均衡与横向扩展
当单台服务器无法应对高并发时,可通过负载均衡将请求分发到多台PHP-FPM服务器: