thinkphp队列在linux下需手动配置redis驱动、编写规范job类、启动消费者进程并验证异步性,缺一不可。

ThinkPHP队列在 Linux 下要真正跑起来,不是改个配置就完事的。它默认走 sync 驱动——也就是任务一 push 就立刻同步执行,根本没进队列,更谈不上异步。你得手动切驱动、启消费者、配连接参数、加失败处理,缺一不可。
确认驱动类型并修改 config/queue.php
打开 config/queue.php,重点检查两项:
- 'default' => 'redis'(不能是 'sync' 或留空)
-
connections.redis 下必须显式定义以下字段(ThinkPHP 8+ 不读取全局 Redis 配置):
'host' => '127.0.0.1''port' => 6379'-
'password' => ''(如有密码请填对) -
'database' => 0(注意:不是'select',该参数已废弃) -
'retry_after' => 90(值需大于任务最长执行时间,比如发短信耗时 15 秒,这里至少设 20)
Database 驱动则需先运行 php think queue:table 建表,并确保 connections.database.connection 指向可用数据库连接。
创建并规范编写 Job 类
用命令生成任务类:php think make:job SendNotificationJob
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
在 app/job/SendNotificationJob.php 中,fire 方法必须包含 $job->delete() 或 $job->release(),否则任务会卡住不结束:
- 执行成功:调用
$job->delete() - 执行失败且需重试:调用
$job->release(30)(30 秒后重试) - 失败超限:记录日志后
$job->delete(),避免无限堆积
启动消费者进程并设为开机自启
单次运行测试:php think queue:work --queue=default --delay=3 --memory=128 --sleep=3
生产环境必须用进程管理工具长期运行,推荐 Supervisor:
- 配置文件如 /etc/supervisor/sub_conf/tp_queue.conf 中,
command要写绝对路径(如/usr/bin/php /var/www/html/think queue:work) -
directory必须设为项目根目录 - 启用
autostart=true和autorestart=true,并设置startretries=20 - 日志路径需提前创建并赋写权限:
touch /var/log/tp_queue.log && chmod 777 /var/log/tp_queue.log
验证是否真异步运行
别只看 push 返回 true,做两件事确认:
- 在 job 的
fire()里加sleep(5); \think\facade\Log::info('job started'); - 发起 HTTP 请求触发 push,观察响应时间:
- 如果页面秒回 → 已切换到异步(Redis 正常工作)
- 如果页面卡 5 秒 → 还在 sync 模式或消费者没启动
- 执行
php think queue:status查看 pending、failed 数量 - 用
redis-cli连上 Redis,执行KEYS *queue*看是否有类似queues:default的 key
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










