进程管理是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用户一致,避免权限问题导致的性能损耗。