PHP-FPM 使用 dynamic 和 ondemand 进程管理模式有什么区别?

文章导读
dynamic 模式启动时预创建至少 1 个子进程(pm.start_servers 默认值为 pm.min_spare_servers + (pm.max_spare_servers - pm.min_spare_servers) / 2),而 ondemand 模式启动时不创建任何 worker 进程,仅在连接到来时按需 fork,首次响应延迟可能增加 10 秒以上(pm.proce
📋 目录
  1. 原因分析
  2. 解决方案:如何选择进程管理模式
  3. 注意事项
  4. 参考来源
A A

PHP-FPM 使用 dynamic 和 ondemand 进程管理模式有什么区别?

核心结论:dynamic 模式启动时预创建至少 1 个子进程(pm.start_servers 默认值为 pm.min_spare_servers + (pm.max_spare_servers - pm.min_spare_servers) / 2),而 ondemand 模式启动时不创建任何 worker 进程,仅在连接到来时按需 fork,首次响应延迟可能增加 10 秒以上(pm.process_idle_timeout 默认值)。

原因分析

两种模式的根本差异在于进程生命周期管理策略。dynamic 模式通过 1 秒定时器检查空闲 worker 数量,当 idle < pm.min_spare_servers 时创建新进程,当 idle > pm.max_spare_servers 时关闭启动时间最长的空闲进程。ondemand 模式同样使用 1 秒定时器,但触发条件是连接到来而非实际请求,且空闲时间超过 pm.process_idle_timeout(默认 10s)后关闭所有 worker。

从资源消耗角度看,static 模式固定数量子进程(如 pm.max_children = 50)在空闲时也占满内存,dynamic 模式平衡内存与响应速度,ondemand 模式省内存但频繁 fork 可能压垮低配机器。配置文件位于 /etc/php/8.2/fpm/pool.d/www.conf,pm 配置项决定 PHP 子进程怎么生、怎么活、怎么死。

解决方案:如何选择进程管理模式

场景一:中小流量业务选择 dynamic

适用于 CMS、后台系统等 CPU/内存较均衡的业务。配置示例:

pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500

配置项要求:pm.min_spare_servers/pm.max_spare_servers 有效范围 (0,pm.max_children],pm.start_servers 有效范围 [pm.min_spare_servers,pm.max_spare_servers]。dynamic 模式是最常用的,因为它能够根据实际情况灵活调整进程数。

PHP-FPM 使用 dynamic 和 ondemand 进程管理模式有什么区别?

场景二:极低流量或调试环境选择 ondemand

适用于个人博客、测试环境等访问量极低的场景。配置示例:

pm = ondemand
pm.max_children = 20
pm.process_idle_timeout = 10s

注意:pm.process_idle_timeout 要设短(如 10s),否则空闲进程长期不回收反而占内存。在大流量系统上 master 进程会变得繁忙,占用系统 cpu 资源,不适合大流量环境的部署。

场景三:高吞吐低延迟服务选择 static

适用于 API 网关层 PHP 后端等高并发且请求量稳定的场景。计算公式:pm.max_children = 预估峰值并发 ÷ 单进程平均处理耗时 (单位秒) × 安全冗余 (建议 1.2–1.5 倍)。缺点是空闲时也占满内存,但响应速度最快。

注意事项

1. ondemand 模式触发条件是连接的到来,而不是实际的请求(例如只进行连接比如 telnet,不发请求数据也会新建 worker),这可能导致在大流量系统上 master 进程繁忙。

PHP-FPM 使用 dynamic 和 ondemand 进程管理模式有什么区别?

2. dynamic 模式下,当 idle >= pm.max_children 时会打印 WARNING 日志并结束本次处理,需要监控日志避免进程数超限。

3. 全局配置 process.max 控制 FPM 能够创建的最大子进程数量,在使用多个 pm = dynamic 配置的 php-fpm pool 进程池时,控制全局的子进程数量,默认值为 0 代表无限制。

4. PHP-FPM 在 5.4 之后已经整合进入 PHP 源代码中,如果需要使用,在./configure 的时候带上 -enable-fpm 参数即可。

5. emergency_restart_threshold 如果在 emergency_restart_interval 设定的时间内收到该参数设定次数的 SIGSEGV 或 SIGBUS 退出的信号,则 FPM 会重新启动,默认值为 0 表示关闭该功能。

PHP-FPM 使用 dynamic 和 ondemand 进程管理模式有什么区别?

参考来源

来源:技术博客 - PHP-FPM 如何配合负载均衡_进程管理配置详细教程【方法】(2026 年 2 月 14 日)

来源:技术教程 - php-fpm 的 pm 进程管理模式有哪些(2025 年 8 月 27 日发布)

来源:技术详解 - FastCGI 和 PHP-FPM 区别_运行模式对比说明【详解】(2026 年 3 月 15 日)

来源:技术解析 - php-fpm 解读 - 进程管理的三种模式(2020 年 8 月 20 日)