ThinkPHP6原生不支持万级并发,需分层优化:关闭调试、切换Redis缓存、清空阻塞源;调优PHP-FPM进程数与MySQL连接配置;非核心逻辑交由队列异步处理;最终通过Swoole/Workerman替代PHP-FPM并启用协程连接池实现跃升。

ThinkPHP6 本身是同步阻塞框架,原生不支持万级并发。所谓“一万并发大量请求堆积”,本质是 PHP-FPM 进程耗尽、数据库连接打满、缓存锁争抢、日志或 Session 同步阻塞等多重瓶颈叠加的结果。单纯调大配置或加机器治标不治本,必须分层拆解、定向突破。
立刻缓解堆积:快速止血三步
先稳住线上,避免雪崩:
- 立即关闭调试模式:APP_DEBUG = false(.env 或 config/app.php),停掉 trace 日志和调试信息输出
- 临时禁用文件缓存驱动:把 config/cache.php 中 default 改为 'redis',并确认 Redis 连接正常、key 过期时间合理(避免永久缓存)
- 强制清空当前阻塞源:执行 php think clear:cache,若用 file 驱动且 runtime/cache/ 已占满磁盘,直接 rm -rf runtime/cache/*(切勿删 runtime/ 全目录)
根治连接瓶颈:数据库与 PHP-FPM 协同调优
请求堆积常因 MySQL 连接数爆满或 PHP worker 不足导致排队:
- 检查 MySQL 当前连接:show status like 'Threads_connected';,若接近 max_connections(默认151),需调高该值,并在 TP6 数据库配置中启用长连接:'params' => [PDO::ATTR_PERSISTENT => true]
- 限制 PHP-FPM 并发上限:在 www.conf 中设 pm.max_children = 48(根据内存调整,每进程约30–50MB),禁用 pm.start_servers 动态模式,改用 static
- 避免事务滥用:Db::transaction() 内不要做网络请求或 sleep;超时未提交的事务会死锁连接,建议用 try/catch + Db::rollback() 显式控制
绕过同步阻塞:用队列剥离非核心逻辑
TP6 控制器里任何 file_get_contents、curl_exec、邮件发送、日志写入(尤其文件驱动)都会让整个 PHP 进程卡住。正确做法是:
立即学习“PHP免费学习笔记(深入)”;
- Web 层只做参数校验、Redis 预扣库存、返回成功响应;耗时操作全部交给队列
- 使用 Redis 队列(推荐):Queue::push('OrderProcessJob', ['order_id' => 123]),再用 php think queue:work --daemon 启动常驻消费者
- 若用 RabbitMQ,绝不能在控制器内 new AMQPConnection;必须封装为独立命令行生产者,由 Supervisor 守护运行
跃升并发能力:切换 Swoole 或 Workerman 模式
要真正支撑万级并发,必须脱离 PHP-FPM。TP6 官方扩展 think-swoole 已解决生命周期污染问题:
- 安装后执行 php think swoole:start 启动协程服务器,所有请求在内存中复用 App 实例
- 数据库需配连接池:'pool_size' => 100(Swoole 连接池),禁用 PDO::ATTR_PERSISTENT(协程下长连接无效)
- 禁用所有文件类缓存(如 route、template),改用 Redis;日志路径需指向可写目录,避免多协程写同一文件冲突



















