支撑thinkphp6达1万并发需四层协同:nginx连接承载、php-fpm进程与内存配比(pm=static+合理max_children)、内核资源放开(file-max/ulimit)、thinkphp启用swoole数据库连接池,仅调高pm.max_children无效且危险。

要支撑 ThinkPHP6 达到 1 万并发请求,光靠调高 pm.max_children 是无效甚至危险的——它只是 PHP-FPM 的子进程上限,不是并发能力本身。真正起决定作用的是:Nginx 连接承载能力、PHP-FPM 进程与内存配比、内核资源限制、以及 ThinkPHP 自身的连接复用机制是否启用。下面分四块讲清楚关键配置和避坑点。
一、PHP-FPM 进程数不能只看“10000”这个数字
假设每个 PHP-FPM 子进程平均占用 25MB 内存(中等业务逻辑,含 OPcache + PDO),那 10000 并发 ≈ 需要 250GB 内存 —— 显然不现实。实际应按服务器真实资源倒推:
- 先查空载时单个 php-fpm 进程真实内存:运行
ps aux --sort=-%mem | grep "php-fpm:" | head -n 5,取 RSS 值(单位 KB) - 可用给 PHP 的总内存建议 ≤ 总内存 × 70%(预留系统、MySQL、缓存等)
- 算出合理
pm.max_children:比如 64GB 服务器,留 20GB 给系统,剩 44GB 可用 → 44 × 1024 ÷ 25 ≈ 1800 -
必须搭配
pm = static:动态模式(dynamic)在突发流量下进程伸缩延迟明显,高并发场景推荐静态固定进程池
二、Nginx 层必须同步扩容,否则卡在入口
PHP-FPM 再多,Nginx 拦不住请求也没用。需确认并调整以下三项:
-
worker_processes auto;(或设为 CPU 核心数) -
worker_connections 10240;(单 worker 最大连接数,总并发 = worker_processes × worker_connections) -
events { use epoll; multi_accept on; }(Linux 下启用高效事件模型) - 补充限流保护:
limit_conn_zone $binary_remote_addr zone=tp_ip:10m;+limit_conn tp_ip 20;,防单 IP 扫描拖垮服务
三、ThinkPHP6 必须关闭阻塞式数据库短连接
默认 Db::table() 每次请求新建 PDO 连接,1 万并发可能瞬间打爆 MySQL 的 max_connections(默认 151)。必须启用连接池:
- 仅安装
topthink/think-swoole扩展(Swoole ≥ 4.8.0)才有效;FPM 模式下db_pool配置完全不生效 - 在
config/swoole.php中配置:'db_pool' => ['max_active' => 200, 'max_idle' => 10, 'wait_timeout' => 3000] - 代码中显式走池子:
Db::pool()->table('user')->select(),模型类也要写protected $connection = 'pool_db'; - MySQL 侧同步调大:
SET GLOBAL max_connections = 2000;(需有 SUPER 权限)
四、系统级资源必须放开,否则直接被内核掐断
Ubuntu 默认 ulimit 往往只有 1024,远不够支撑万级连接:
- 临时生效:
sudo sysctl -w fs.file-max=2097152 - 永久生效:编辑
/etc/sysctl.conf加入fs.file-max = 2097152 - 修改
/etc/security/limits.conf,追加:* soft nofile 1048576 * hard nofile 1048576 www-data soft nofile 1048576 www-data hard nofile 1048576
- 重启 php-fpm 前,确保其启动用户(如 www-data)已加载新 limits(可查
cat /proc/$(pgrep php-fpm)/limits | grep "Max open files")
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











