thinkphp6需依托swoole或workerman替代php-fpm以支撑万级并发;推荐官方think-swoole封装方案,配置worker_num=cpu核数、max_coroutine=3000、启用db/redis连接池,并配合nginx反代、禁用file缓存与调试中间件。

ThinkPHP6 本身不直接管理并发进程,它依赖底层服务器模型。要扛住 1 万并发请求,关键不是“TP6 开多少进程”,而是用 Swoole 或 Workerman 替换 PHP-FPM,并合理配置其工作模型——TP6 只是运行在它们之上的业务逻辑层。
选对底层:Swoole 还是 Workerman?
两者都能支撑万级并发,但机制不同:
- Swoole:基于协程 + 多进程,单 Worker 进程可并发处理数千请求(靠协程切换),适合 IO 密集型场景(如调 API、查 Redis、WebSocket)
- Workerman:纯多进程 + 事件循环,无协程,每个进程一次只处理一个请求,靠增加进程数横向扩容,更适合同步风格老项目或强稳定长连接广播
万并发推荐优先选 think-swoole(官方封装),它已解决 TP6 生命周期隔离问题,避免 session 污染、DB 连接复用失败等典型崩盘点。
Swoole 进程与协程核心配置(以 think-swoole 为例)
配置文件:config/swoole.php
'server' => [
'host' => '0.0.0.0',
'port' => 9501,
'mode' => SWOOLE_PROCESS,
'options' => [
'worker_num' => 4, // 建议设为 CPU 核数(如 4 核就填 4)
'task_worker_num' => 4, // 用于异步任务(如发邮件、日志归档)
'max_coroutine' => 3000, // 协程最大并发数,1 个 worker 支持约 3000 并发请求
'reactor_num' => 4, // Reactor 线程数,建议等于 worker_num
'daemonize' => true, // 后台运行
'pid_file' => runtime_path() . 'swoole.pid',
'log_file' => runtime_path() . 'swoole.log',
'package_max_length'=> 20 * 1024 * 1024,
],
],
说明:
- 4 个 Worker 进程 × 每个支持 3000 协程 ≈ 理论 12000 并发连接能力
- 务必关闭
APP_DEBUG = false和所有调试中间件(Trace、Log 写文件),否则日志写爆磁盘 - 禁用 TP6 的
file缓存驱动,改用 Redis;数据库连接池必须开启(pool_size≥ 100)
配套必须做的三件事
光配 Swoole 不够,下面这些漏一项都可能在压测时突然 502 或 MySQL gone away:
-
反向代理 Nginx 配置到位:不能直接暴露 Swoole 端口给用户。Nginx 要加
proxy_http_version 1.1和proxy_set_header Connection '',否则 HTTP/1.0 下协程会卡死 -
Redis 和 DB 连接池显式启用:在
config/database.php中设置'pool_size' => 100;Redis 驱动也要用连接池版(redis_poolstore) -
日志路径独立且非阻塞:Swoole 日志和 TP6 应用日志必须分开,且不能写到同一文件;推荐用
monolog+stream驱动,避免 fwrite 阻塞协程
验证与压测小提示
启动后执行:php think swoole start
检查是否生效:
-
ps -ef | grep swoole查看 worker/task 进程数量是否匹配配置 -
netstat -anp | grep :9501 | wc -l看 ESTABLISHED 连接数 - 用
ab -n 10000 -c 2000 http://your-domain/初步压测(注意 Nginx 和系统 ulimit 要同步调高)
真实万并发需配合负载均衡(多台 Swoole 服务)+ Redis 集群 + MySQL 主从,单机 Swoole 是能力基座,不是全部。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











