thinkphp6 稳定支撑 1 万并发的关键是避免请求排队堆积,需分层优化:一、调优 php-fpm 与 nginx 防止底层排队;二、用 redis 异步队列剥离非实时操作;三、采用 apcu+redis 多级缓存绕过数据库瓶颈;四、升级 swoole 实现协程并发。

ThinkPHP6 要稳定支撑 1 万并发请求,关键不在“扛住瞬间涌入”,而在于**不让请求排队堆积**。排队本质是资源(PHP 进程、数据库连接、Redis 连接、磁盘 I/O)跟不上请求节奏,导致请求在 Nginx 或 PHP-FPM 层面等待。优化需分层击破,聚焦“削峰、分流、减负、提效”四个动作。
一、掐断排队源头:PHP-FPM 与 Nginx 协同调优
排队最先发生在 Web 服务器层。默认配置下,1 万个并发远超常规 FPM worker 容量,必然触发排队或 503。
- 调整 www.conf 中的 pm.max_children:按单个 PHP 进程平均内存(通常 20–40MB)和服务器可用内存计算,例如 8GB 内存建议设为 128–192,切勿盲目设 1000+;
- 启用 pm.max_requests = 500,防止内存泄漏累积导致进程僵死;
- Nginx 端设置 worker_connections 20480,并开启 keepalive_timeout 60,复用连接减少握手开销;
- 关闭 fastcgi_buffering off(如使用流式响应场景),避免大响应体阻塞 worker。
二、释放主线程:异步队列必须落地
所有非实时必需操作——订单创建后的短信通知、支付成功后的库存扣减、用户注册后的欢迎邮件——必须剥离出主请求链路。否则一个 200ms 的同步发信,会让 1 万请求中近半数卡在 PHP 进程里。
- 生产环境强制使用 Redis 队列驱动(
QUEUE_CONNECTION=redis),无需额外中间件,启动快、延迟低; - 控制器内仅执行
Queue::push(new NotifyJob($data)),耗时控制在 5ms 内; - 部署至少 3 个常驻消费者:
php think queue:work --queue=default --daemon,配合 supervisor 管理进程生命周期; - 秒杀类场景加 Redis 原子操作(
DECR+GET)校验库存,防超卖的同时避免数据库行锁竞争。
三、绕过数据库瓶颈:缓存必须分层且精准
MySQL 默认 max_connections=151,1 万并发直连必崩。不能只靠“加索引”,要让绝大多数读请求根本不到数据库。
- 全局禁用文件缓存:
CACHE_TYPE=redis,避免高并发下文件锁排队; - 对热点数据(如商品详情、配置项)使用 多级缓存:先查
apcu_get()(进程内),未命中再查 Redis; - 缓存 key 必须带业务版本号或更新时间戳,例如
product:1001:v2,避免全量缓存失效雪崩; - 写操作后主动
Cache::delete('product:1001'),而非依赖过期,确保强一致性。
四、升级运行模型:Swoole 是质变关键
传统 FPM 模型下,每个请求独占一个进程,1 万并发 ≈ 1 万进程,内存与上下文切换成本极高。Swoole 将 PHP 变成常驻服务,单进程可协程并发处理数千请求。
- 安装 Swoole 扩展(v5.0+),启用
extension=swoole; - 用
think-swoole官方扩展替换 FPM 启动方式,HTTP Server 直接监听端口; - 将日志、Session、数据库连接等组件适配为协程安全版本(如
co\Redis、co\PDO); - 静态资源交由 Nginx 直接服务,Swoole 专注处理动态逻辑,降低整体负载。
不复杂但容易忽略:真正的 1 万并发不是压测工具打出的瞬时数字,而是持续稳定的吞吐能力。它依赖的是配置的合理性、缓存的命中率、队列的消费速度、以及每一处同步 I/O 是否被真正移除。从 FPM 到 Swoole,从文件缓存到 APCu+Redis,从同步发信到队列投递——每一步都在把“等待”变成“并行”。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











