thinkphp5.0需通过think-queue扩展实现异步队列,安装v1.1版本、配置application/extra/queue.php为redis驱动、定义符合fire签名的任务类、用queue::push推送任务,确保cli模式启用redis扩展且connector首字母大写。

ThinkPHP5.0项目中需处理短信发送、订单通知等耗时操作,但当前同步执行导致用户等待超时、接口响应变慢、服务器CPU飙升,必须通过队列将任务异步化,避免阻塞主请求流程。
安装并确认think-queue扩展可用
在项目根目录执行:composer require topthink/think-queue ^1.1(TP5.0仅兼容1.x版本,装错版本会导致Queue门面无法识别)。
安装完成后检查 application/extra/queue.php 是否存在;若不存在,手动创建该文件,并确保其返回数组结构——这是TP5.0读取队列配置的唯一路径,config目录下的queue.php会被忽略。
【关键前提】 必须确认PHP CLI模式已启用redis扩展(php -m | grep redis),否则即使配置Redis驱动,php think queue:work 也会静默失败且无报错。
配置Redis驱动并验证连通性
编辑 application/extra/queue.php,写入以下最小可用配置:
'connector' => 'Redis',<br>'host' => '127.0.0.1',<br>'port' => 6379,<br>'password' => null,<br>'select' => 0,<br>'timeout' => 0,<br>'default' => 'default'
注意:TP5.0配置键名为 connector,不是TP6的 driver 或 default 下嵌套 connections;写成 'driver' => 'redis' 将直接导致“Driver [redis] not supported”错误。
运行 php think queue:failed,若返回空但提示“Connection refused”,说明Redis未启动或端口不通;若报“Driver [Redis] not supported”,则 connector 值大小写错误(必须首字母大写)。
定义任务类并确保fire方法可执行
在 app/job/SendSmsJob.php 创建任务类:
namespace app\job;<br>use think\Queue\Job;<br>class SendSmsJob {<br> public function fire(Job $job, $data) {<br> // 执行发短信逻辑<br> send_sms($data['phone'], $data['content']);<br> // 成功后必须手动删除,否则任务会无限重试<br> $job->delete();<br> }<br>}
TP5.0不强制继承基类,但fire(Job $job, $data)签名不可更改;参数类型声明缺失会导致框架无法反射调用,直接跳过该任务。
切勿在fire中throw Exception——TP5.0的think-queue不会自动捕获并重试;如需重试,应抛出 think\exception\RetryException;如需永久失败,抛出其他异常即可。
推送任务到队列
在控制器中调用:
use think\Queue;<br>Queue::push('app\job\SendSmsJob', ['phone' => '13800138000', 'content' => '验证码1234'], 'sms');
第一个参数是完整命名空间字符串,不能传对象或匿名函数;第二个参数必须是可序列化的数组或stdClass;第三个参数指定队列名,与后续worker监听的队列严格对应。
若使用延迟任务,改用 Queue::later(60, ...),单位为秒;延迟时间过短(如
启动消费者并守护进程
第一步:测试消费是否正常
执行 php think queue:work --queue=sms --tries=3 --sleep=2,观察控制台是否打印任务执行日志。若无输出,检查queue.php中default是否误设为'sms'(它只影响未指定--queue时的默认值,不决定监听目标)。
第二步:生产环境启用常驻
安装Supervisor后,配置项中command必须写全路径:/usr/bin/php /var/www/tp5/public/index.php think queue:work --queue=sms --daemon --memory=128 --sleep=3。
【不可逆操作】 不加 --daemon 参数会导致进程每执行一个任务就退出,无法持续监听。
第三步:设置失败任务回收
执行 php think queue:failed-table 生成failed_jobs表,再运行 php think queue:listen 可查看失败记录;但TP5.0不支持自动重试失败任务,需人工执行 php think queue:retry all 或指定ID。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











