PHP-FPM的进程管理方式及优化

目录

概述

PHP-FPM 有两个主要分支,分别对应 PHP 5.2.x 和 PHP 5.3.x 版本。在 5.2.x 中配置为 XML 格式,5.3.x 后改为与 php.ini 相同的配置风格。

PHP-FPM 支持两种进程管理方式:static(静态)和 dynamic(动态)。在早期版本中 dynamic 被称作 apache-like。

Static 模式

特点:php-fpm 进程数自始至终保持恒定,不会增加或减少。

参数:只有 pm.max_children 生效,表示开启的进程数量。

pm = static
pm.max_children = 100

适用场景

  • 内存充足的服务器(8GB 以上):可以设置较大的固定进程数,避免频繁的进程启停
  • 服务器内存足够时效率最高,因为不需要额外的进程数目控制开销
  • 进程数计算:内存 / 30MB,如 8GB 可设 100,耗费内存 2-3GB

Dynamic 模式

特点:php-fpm 进程数根据负载动态增减,在 pm.min_spare_serverspm.max_spare_servers 之间调整。

参数

pm = dynamic
pm.max_children = 100
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 50

参数说明

  • pm.start_servers:启动时的初始进程数
  • pm.min_spare_servers:最小空闲进程数,不足时会创建新进程
  • pm.max_spare_servers:最大空闲进程数,超过时会杀死多余进程
  • pm.max_children:最大进程数上限

适用场景

  • 内存受限的服务器(256MB-1GB VPS):动态模式会结束多余进程,回收内存
  • 进程数计算:内存 / 20MB,如 512MB 建议 pm.max_spare_servers = 20pm.min_spare_servers = 5-10

内存泄露问题

PHP-FPM 进程在执行过程中会有内存泄露问题(类似 Apache):

  • 刚启动时占用约 3MB
  • 运行一段时间后会上升到 20-30MB

为了防止无限增长,应该设置 pm.max_requests 让进程定期重启。

优化建议

大内存服务器(8GB+)

pm = static
pm.max_children = 250

静态方式效率高,避免进程管理开销。

小内存服务器(1GB)

pm = dynamic
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20
pm.max_children = 50

动态方式更加平稳,可回收释放内存。

超小内存 VPS(256MB)

pm = dynamic
pm.start_servers = 5
pm.min_spare_servers = 2
pm.max_spare_servers = 10
pm.max_children = 12

严格控制进程数,防止内存溢出。

实现历史

在 PHP 5.2.x 版本中,apache-like 模式形同虚设,实际配置并未生效。直到 PHP 5.3.x 才真正实现了动态进程管理,并改名为 dynamic,使概念更加清晰。

性能对比

与 Apache 类似,选择哪种模式主要取决于服务器的硬件资源:

  • Static 优势:无需进程管理开销,性能稳定
  • Dynamic 优势:节省内存,可应对流量波动
  • 对于 HTTP POST 请求,两者在处理大数据上传时都需要调整超时参数

#php #nginx