ThinkPHP6稳定支撑1万并发必须用Swoole协程替代PHP-FPM,启用think-swoole扩展、协程数据库驱动(co-mysql)、协程Redis/HTTP客户端,并将耗时任务投递至Task Worker或Redis/RabbitMQ队列。

ThinkPHP6 要稳定支撑 1 万并发,单靠传统 FPM 模式根本不可行。核心解法不是“调高参数”,而是切换运行模型——用 Swoole 协程替代 PHP-FPM 进程模型,并围绕协程特性重构关键链路。重点不在堆资源,而在让每个请求的 I/O 等待不浪费 CPU 时间。
用 think-swoole 替换 FPM 入口
这是最基础也最关键的一步。FPM 下每请求起一个进程,1 万并发意味着 1 万进程,内存和上下文切换直接压垮服务器。Swoole 启动常驻 HTTP 服务,靠协程复用少量线程处理海量连接。
- 安装扩展:
pecl install swoole,确认 php.ini 中启用extension=swoole - 引入组件:
composer require topthink/think-swoole - 配置端口与工作模式:修改
config/swoole.php,明确设置'http' => ['host' => '0.0.0.0', 'port' => 8080],不要依赖默认值 - 启动命令:
php think swoole,而非php -S或 Nginx + FPM 组合
数据库连接必须用协程版驱动
普通 MySQLi/PDO 在协程环境下会阻塞整个进程。必须使用 Swoole 官方协程 MySQL 客户端或 ThinkPHP 兼容的协程适配器。
- 在
config/database.php中,将'type' => 'mysql'改为'type' => 'co-mysql'(需配合topthink/think-swoole的协程支持) - 启用连接池:
'pool_size' => 100,避免每次请求新建连接;'pool_get_timeout' => 5防止获取连接卡死 - 读写分离配置要生效:确保
'deploy' => 1和'rw_separate' => true写在 mysql 连接配置内部,主库走 default,从库用 slave 数组结构
所有 I/O 操作必须协程化
Redis、HTTP 请求、文件读写等,只要涉及等待,就必须用 Swoole 提供的协程版本,否则一个慢请求会拖慢整条协程队列。
立即学习“PHP免费学习笔记(深入)”;
- Redis:用
Swoole\Coroutine\Redis,不是Predis或phpredis同步客户端 - 第三方 API 调用:用
Swoole\Coroutine\Http\Client,支持并发请求、超时控制、自动重试 - 日志写入:避免同步写文件,改用异步日志通道或先写 Redis 队列再批量落盘
- 文件上传:大文件建议前端直传对象存储,后端只收回调;若必须走 PHP,用
Swoole\Coroutine\FileSystem异步读取
任务与推送类操作必须剥离主线程
注册发邮件、下单后通知、生成报表等耗时逻辑,绝不能放在 HTTP 响应内执行。必须投递到 Task Worker 或独立队列消费者中。
- 用 think-swoole 的 Task 机制:控制器内调用
$server->task($data),监听swoole.task事件处理 - 高可靠场景(如支付回调)用 RabbitMQ:消息持久化 + ACK 确认,防止任务丢失
- 轻量高频任务(如日志记录、缓存更新)用 Redis List + brpop:消费者常驻协程监听,无额外中间件开销
- WebSocket 推送:用 Swoole WebSocket Server 原生支持,别用轮询或长连接模拟



















