温馨提示×

ubuntu php-fpm怎样调线程数

小樊
43
2026-09-19 13:34:48
栏目: 编程语言

Ubuntu 上,PHP-FPM 实际上不是用“线程”,而是用 进程(process)+ 子进程(children) 来处理请求的。所以你说的“线程数”,在 PHP-FPM 里对应的是 进程数(pm 相关配置)

下面按常见场景说明。


一、找到 PHP-FPM 配置文件

先确认你用的是哪个 PHP 版本,例如 PHP 8.1:

php -v

配置文件一般在:

/etc/php/8.1/fpm/pool.d/www.conf

(如果是其他版本,把 8.1 换成你的版本号)


二、PHP-FPM 的进程模式(重点)

www.conf 中,关键参数是:

pm = dynamic

PHP-FPM 支持三种模式:

1️⃣ dynamic(最常用)

动态进程数,根据负载自动调整。

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

含义:

  • pm.max_children:最大子进程数(≈你理解的“最大并发能力”)
  • start_servers:启动时的进程数
  • min_spare_servers:最少空闲进程
  • max_spare_servers:最多空闲进程

一般调这个就够


2️⃣ static(高并发、内存充足)

固定进程数:

pm = static
pm.max_children = 100

优点:

  • 性能稳定
  • 没有进程创建销毁开销

缺点:

  • 内存占用固定且较高

3️⃣ ondemand(省内存)

按需启动:

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

适合:

  • 低流量
  • 内存小的机器

三、怎么算 max_children(很重要)

经验公式:

max_children ≈ 总内存 / 单个 PHP 进程内存

例如:

  • 服务器 2GB
  • 每个 PHP 进程约 40MB
2048 / 40 ≈ 50

所以:

pm.max_children = 50

⚠️ 不要设太大,否则会 OOM(内存爆了)


四、修改后重启 PHP-FPM

sudo systemctl restart php8.1-fpm

查看状态:

systemctl status php8.1-fpm

五、查看当前进程数

ps aux | grep php-fpm

或:

pstree -p | grep php-fpm

六、常见误区

❌ PHP-FPM 没有“线程数”
✅ 只有 进程数(children)

❌ nginx 的 worker 不等于 PHP-FPM
✅ nginx 负责接请求,PHP-FPM 负责执行 PHP


七、如果你愿意

你可以告诉我:

  • Ubuntu 版本
  • PHP 版本
  • 服务器内存
  • 网站类型(API / 商城 / WordPress)

我可以帮你直接算一套最优配置

0