进程管理是PHP-FPM优化的核心,直接影响并发处理能力和资源利用率。
dynamic模式(动态调整进程数),可根据负载自动增减进程,适合大多数高并发场景;若服务器长期处于低负载,可使用ondemand模式(按需启动进程),进一步节省资源。pm.max_children:根据服务器内存和CPU计算最大进程数(公式:(总内存 - 系统预留内存) / 单个进程内存占用,如16GB内存、每个PHP进程占用100MB,则建议设置为150-160)。pm.start_servers:启动时的初始进程数,建议设置为pm.max_children的1/4-1/2(如pm.max_children=50,则设置为10-25)。pm.min_spare_servers/pm.max_spare_servers:空闲进程的最小/最大数量,确保负载突增时有足够进程处理请求(如pm.min_spare_servers=5、pm.max_spare_servers=30)。pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 30
合理的内存配置可避免进程因内存不足被系统杀死,提升稳定性。
memory_limit设置每个PHP进程的最大内存(如128M或256M,根据应用需求调整,避免设置过大导致内存溢出)。pm.max_requests设置每个进程处理的最大请求数(如500-1000),定期重启进程可释放潜在的内存泄漏,防止内存碎片积累。OPcache是PHP内置的操作码缓存,可缓存编译后的PHP脚本,减少重复编译时间,显著提升脚本执行速度。
opcache.enable=1:开启OPcache。opcache.memory_consumption=128:分配给OPcache的内存大小(如128M,根据服务器内存调整)。opcache.interned_strings_buffer=8:优化字符串存储的内存缓冲区大小。opcache.max_accelerated_files=4000:允许缓存的脚本文件数量(需大于项目中PHP文件总数)。opcache.revalidate_freq=60:脚本更新后重新验证的时间间隔(单位:秒,如60秒)。php.ini):[opcache]
zend_extension=opcache.so
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
优化Nginx与PHP-FPM的通信可减少数据传输延迟,提升整体响应速度。
fastcgi_buffers和fastcgi_buffer_size调整缓冲区大小(如fastcgi_buffers 8 16k;表示8个16KB的缓冲区,fastcgi_buffer_size 32k;表示缓冲区大小为32KB),避免频繁的磁盘I/O。fastcgi_read_timeout设置读取PHP-FPM响应的超时时间(如30s或60s,根据脚本执行时间调整,避免长时间等待)。location ~ \.php$块):location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_buffers 8 16k;
fastcgi_buffer_size 32k;
fastcgi_read_timeout 30s;
}
慢查询日志可记录执行时间过长的PHP脚本,帮助开发者快速定位性能问题。
slowlog:设置慢查询日志文件路径(如/var/log/php-fpm/www-slow.log)。request_slowlog_timeout:设置慢查询的阈值(如5s,表示执行时间超过5秒的脚本会被记录)。www.conf):slowlog = /var/log/php-fpm/www-slow.log
request_slowlog_timeout = 5s
通过监控工具实时跟踪PHP-FPM的性能指标,及时调整配置以适应流量变化。
pm.status_path = /status),通过Nginx访问http://服务器IP/status查看进程数、请求处理时间等指标(需配置Nginx权限)。pm.max_children设置是否合理,是否存在内存瓶颈)。notice(log_level = notice),减少不必要的日志输出,降低磁盘I/O。catch_workers_output = yes,将子进程的输出重定向到错误日志,便于排查脚本问题。www-data)与Nginx用户一致,避免权限问题导致的性能损耗。