ThinkPHP6启用队列需安装think-queue^3.0扩展、配置Redis驱动(注意type非driver)、创建继承Job类且含fire方法的任务、用Queue::push等推送任务、执行php think queue:work --daemon启动监听。

在ThinkPHP6中启用队列任务,是为了把发邮件、生成报表、同步数据等耗时操作从HTTP请求中剥离出来,避免用户长时间等待或超时中断。不装扩展、不配Redis、不写fire方法,队列根本不会动——哪怕你写了Queue::push也只会静默失败。
安装think-queue扩展
执行命令:composer require topthink/think-queue ^3.0。
装完检查vendor/topthink/think-queue目录是否存在,若为空或报错,说明安装失败,需换国内镜像重试。
【必须用^3.0】:^2.0与TP6容器机制不兼容,会导致php think queue:listen命令根本不存在。
立即学习“PHP免费学习笔记(深入)”;
配置Redis驱动
打开config/queue.php,确保返回数组中包含以下关键配置:
'default' => 'redis'必须与'connections' => ['redis' => [...]]里的键名完全一致;
'connections.redis.type' => 'redis'——注意是type不是driver,写错就无法识别驱动;
'connections.redis.host'、'port'、'password'、'select'四项必须填对,其中'select'对应Redis数据库编号(如5),不是'database'字段。
若Redis未启用phpredis扩展,或连接参数有误,队列会静默失败,无任何报错提示。
创建任务类并定义fire方法
使用命令生成任务类:php think make:job SendEmailJob。
打开生成的文件,确认命名空间为app\job(单模块项目)或适配你自己的模块路径;
类必须继承think\queue\Jobs\Job,且fire方法签名严格为public function fire(Job $job, $data)——【不能写成handle()】,否则队列监听器完全不调用;
方法体内必须显式调用$job->delete()标记完成,否则任务会在Redis中反复被取出执行;
若需重试,可抛出\think\exception\RetryException;若想彻底失败进failed_jobs表,需先执行php think queue:table和php think migrate:run建表,再抛其他异常。
推送任务到队列
方法一:立即执行Queue::push('app\job\SendEmailJob', ['email' => 'user@example.com']);
方法二:延迟执行Queue::later(60, 'app\job\SendEmailJob', ['email' => 'user@example.com']);——60秒后投递。
方法三:指定非默认队列名Queue::push('app\job\SendEmailJob', $data, 'sms');——此时必须用php think queue:work --queue sms监听,否则任务无人消费。
【第一个参数必须是字符串类名】:传对象实例(如new SendEmailJob())或带@method语法(如'app\job\SendEmailJob@send')均无效,会序列化失败或静默跳过。
启动消费者进程
第一步:确认Redis服务正在运行,且PHP能连上;
第二步:在项目根目录执行:php think queue:work --daemon --max-jobs=100;
第三步:该命令会持续监听default队列,每处理100个任务自动重启worker,防止内存泄漏;
若要监听指定队列,例如sms,则改用:php think queue:work --queue sms --daemon;
生产环境务必加--daemon参数,否则进程退出后任务即停摆;不加该参数仅用于调试单次执行。



















