用队列处理批量添加可避免超时、内存溢出和连接中断:web接口仅校验并推入任务,消费者分批插入(300–400条/批)、手动gc、事务包裹,配合redis驱动、supervisor守护、失败重试与死信队列闭环。

用队列处理批量添加,核心是把耗时操作从 Web 请求中剥离出来,交由后台常驻进程异步执行,彻底避开 PHP 脚本超时、内存溢出和 MySQL 连接中断等问题。
为什么不能在接口里直接跑大批量插入
Web 请求通常有 30–120 秒超时限制,而 10 万条数据即使分片也需数秒到数十秒;PHP 内存随数据量线性增长,未及时 gc 容易爆限;MySQL 的 max_allowed_packet 和锁表时间也会触发失败。这些都不是框架能绕开的底层约束。
用 think-queue 拆解任务并分批执行
ThinkPHP 官方队列扩展 topthink/think-queue 是最匹配的选择,它支持延迟、重试、失败回调,且天然适配 TP6 的 Db 事务与分片逻辑:
- 前端接口只负责接收数据、校验格式、生成唯一任务 ID,并调用
Queue::push()把原始数据或文件路径推入队列(不执行任何数据库操作) - 消费者任务类(如
app\jobs\BatchInsertJob)中,使用Db::transaction()包裹分片后的insertAll(),每批控制在 300–400 条 - 每批执行后手动调用
gc_collect_cycles(),防止 PDO 对象引用堆积 - 任务内不做模型操作(如
saveAll()),避免连接实例不一致导致事务失效
配置与部署要点
队列本身不解决性能问题,靠合理配置才能稳定运行:
- 驱动选
redis或database,避免 file 驱动在高并发下 IO 瓶颈 - 用 Supervisor 管理消费者进程,设置
autostart=true、autorestart=true、startretries=3,保证常驻不掉线 - 消费者命令加内存与超时限制:
php think queue:listen --memory=256 --timeout=600 - 大文件导入场景,建议前端上传 CSV/Excel 到临时目录,队列任务读取解析再分片,而非把整个数组序列化进消息体
失败与重试要闭环
队列不是“扔进去就完事”,必须设计可观测的失败路径:
- 在任务 handle 方法里捕获异常,记录错误日志 + 当前批次数据范围(如第 1201–1600 条)
- 利用
Queue::later(60)实现失败后 1 分钟重试,避免瞬时 DB 压力导致的偶发失败 - 连续失败 3 次自动转入「死信队列」,人工介入排查,而不是无限重试拖垮系统
- 提供后台接口查询任务状态,返回已处理条数、剩余条数、最后成功批次时间戳
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











