在 Ubuntu 上,PHP-FPM 实际上不是用“线程”,而是用 进程(process)+ 子进程(children) 来处理请求的。所以你说的“线程数”,在 PHP-FPM 里对应的是 进程数(pm 相关配置)。
下面按常见场景说明。
先确认你用的是哪个 PHP 版本,例如 PHP 8.1:
php -v
配置文件一般在:
/etc/php/8.1/fpm/pool.d/www.conf
(如果是其他版本,把 8.1 换成你的版本号)
在 www.conf 中,关键参数是:
pm = dynamic
PHP-FPM 支持三种模式:
动态进程数,根据负载自动调整。
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:最多空闲进程✅ 一般调这个就够
固定进程数:
pm = static
pm.max_children = 100
优点:
缺点:
按需启动:
pm = ondemand
pm.max_children = 50
pm.process_idle_timeout = 10s
适合:
经验公式:
max_children ≈ 总内存 / 单个 PHP 进程内存
例如:
2048 / 40 ≈ 50
所以:
pm.max_children = 50
⚠️ 不要设太大,否则会 OOM(内存爆了)
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
你可以告诉我:
我可以帮你直接算一套最优配置。