1. 调整PHP-FPM进程管理参数
进程管理是PHP-FPM性能优化的核心。推荐使用dynamic模式(默认),可根据负载动态调整进程数量,平衡资源利用率与响应速度。关键参数设置:
pm.max_children:根据服务器内存计算(如可用内存-1G后除以单个PHP进程内存占用,约50-200),避免设置过高导致内存耗尽;pm.start_servers:设置为pm.max_children的1/4-1/2(如pm.max_children=50则设为12-25),保证服务器启动时有足够进程处理初始请求;pm.min_spare_servers与pm.max_spare_servers:分别设置为CPU核心数的1-2倍(如4核CPU设为4-8),维持空闲进程池,避免频繁创建/销毁进程的开销;pm.max_requests:每个子进程处理的最大请求数(如500-1000),防止内存泄漏(长期运行的进程可能累积内存占用)。2. 启用并优化OPcache加速
OPcache是PHP脚本编译结果的缓存工具,可显著减少重复编译时间(提升20%-50%性能)。配置步骤:
sudo yum install php-opcache;/etc/php.ini,添加/修改以下参数:[opcache]
zend_extension=opcache.so
opcache.enable=1
opcache.memory_consumption=128 # 缓存内存大小(MB,根据服务器内存调整,如128-256)
opcache.interned_strings_buffer=8 # 内部字符串缓存大小(MB)
opcache.max_accelerated_files=10000 # 缓存文件数量(根据项目文件数调整,如1万-2万)
opcache.revalidate_freq=60 # 脚本更新检查频率(秒,生产环境设为60-300)
opcache.fast_shutdown=1 # 快速关闭,减少内存释放时间
sudo systemctl restart php-fpm。3. 优化PHP配置参数
调整php.ini中的关键参数,提升脚本执行效率与稳定性:
memory_limit:根据应用需求设置(如128M-256M),避免单个脚本占用过多内存;max_execution_time:增加脚本最大执行时间(如300秒),适用于复杂业务逻辑(如数据导入);disable_functions:禁用危险函数(如exec,passthru,shell_exec),防止恶意利用(若应用需要系统操作,可保留必要函数);file_uploads:开启文件上传(On),并根据需求调整upload_max_filesize(如50M)与post_max_size(如50M),支持大文件上传。4. 配置慢日志定位性能瓶颈
启用慢日志记录,分析执行时间过长的请求(如SQL查询慢、代码逻辑问题):
/etc/php-fpm.d/www.conf,设置:request_slowlog_timeout = 2 # 慢请求阈值(秒,如2秒)
slowlog = /var/log/php-fpm/www-slow.log # 慢日志文件路径
tail -f /var/log/php-fpm/www-slow.log实时查看慢请求详情,针对性优化SQL(如添加索引)、代码(如减少循环中的数据库查询)。5. 调整系统资源限制
确保PHP-FPM进程有足够的系统资源,避免因限制导致性能下降:
/etc/security/limits.conf,添加:* soft nofile 65535
* hard nofile 65535
然后执行ulimit -n 65535使设置生效;/etc/sysctl.conf,添加:net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.ip_local_port_range = 1024 65535
执行sysctl -p使设置生效,提升网络连接处理能力。6. 使用缓存系统减少数据库负载
对于频繁访问的数据库查询或动态页面,使用Redis/Memcached缓存结果,降低数据库压力:
sudo yum install redis,并启动服务(sudo systemctl start redis);php-redis)缓存数据,例如:$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$data = $redis->get('cache_key');
if (!$data) {
$data = // 从数据库获取数据
$redis->set('cache_key', $data, 3600); // 缓存1小时
}
echo $data;
可显著减少数据库查询次数(如缓存命中率达90%以上,数据库负载可降低50%以上)。7. 结合Nginx反向代理卸载静态请求
使用Nginx作为反向代理,将静态资源(图片、CSS、JS)请求直接交给Nginx处理,减轻PHP-FPM负担:
/etc/nginx/conf.d/your-site.conf),添加:server {
listen 80;
server_name example.com;
root /var/www/html;
index index.php index.html;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location ~* \.(jpg|jpeg|png|gif|css|js|ico)$ {
expires 30d; # 静态资源缓存30天
access_log off; # 关闭静态资源访问日志
add_header Cache-Control "public";
}
}
重启Nginx(sudo systemctl restart nginx)后,静态资源请求将由Nginx直接处理,PHP-FPM仅需处理动态请求(如PHP页面),提升整体吞吐量。8. 监控与持续调优
定期监控PHP-FPM性能指标(如进程数、内存使用、请求处理时间),根据实际情况调整配置:
top/htop查看PHP-FPM进程的内存与CPU占用;php-fpm -t测试配置文件语法是否正确;systemctl restart php-fpm定期重启PHP-FPM(如每月一次),释放内存并应用新配置;