在Laravel中,用户注册后通常需要执行一些欢迎任务,例如发送欢迎邮件、初始化用户资料等。如果直接同步执行会拖慢注册接口响应,全部丢进默认队列又可能和订单、告警等重要任务挤在一起。通过为欢迎任务设置中等优先级,可以让系统在紧要任务之后、低优先任务之前处理它。

一、理解Laravel的队列优先级机制
Laravel并没有在任务类上直接提供 priority 属性,而是依靠queue:work命令启动时监听的队列顺序以及config/queue.php中的 weight 配置来实现优先级。Redis等驱动支持通过逗号分隔的队列名指定消费次序,排在前面的队列会被优先消费。
1.1 配置多个队列及权重
打开 config/queue.php,在 redis 连接下配置queue和weight:
<?php
// config/queue.php 中的 redis 配置片段
'redis' => [
'driver' => 'redis',
'connection' => 'default',
'queue' => 'high,medium,low',
'weight' => [5, 3, 1], // high权重5,medium权重3,low权重1
'retry_after' => 90,
'block_for' => null,
],
上述配置中,medium 就是我们准备给用户注册欢迎任务使用的中等优先级队列。
二、定义欢迎任务并指定队列
使用 Artisan 命令创建任务类:
php artisan make:job SendWelcomeEmail
在生成的任务类中,通过onQueue方法将任务推送到 medium 队列:
<?php
namespace AppJobs;
use AppModelsUser;
use IlluminateBusQueueable;
use IlluminateContractsQueueShouldQueue;
use IlluminateQueueInteractsWithQueue;
use IlluminateQueueSerializesModels;
use IlluminateSupportFacadesMail;
class SendWelcomeEmail implements ShouldQueue
{
use InteractsWithQueue, Queueable, SerializesModels;
protected $user;
public function __construct(User $user)
{
$this->user = $user;
// 指定该任务进入中等优先级队列
$this->onQueue('medium');
}
public function handle()
{
// 发送欢迎邮件的逻辑
Mail::to($this->user->email)->send(new AppMailWelcomeMail($this->user));
}
}
2.1 在注册逻辑中分发任务
在用户注册控制器里,创建用户后直接分发欢迎任务即可,无需等待其完成:
<?php
namespace AppHttpControllersAuth;
use AppJobsSendWelcomeEmail;
use AppModelsUser;
use IlluminateHttpRequest;
class RegisterController extends Controller
{
public function register(Request $request)
{
$user = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => bcrypt($request->password),
]);
// 分发到 medium 队列,中等优先级处理
SendWelcomeEmail::dispatch($user);
return response()->json(['msg' => '注册成功']);
}
}
三、启动Worker并指定消费顺序
为了让优先级生效,启动队列监听时需要按优先级顺序写明队列名称:
php artisan queue:work redis --queue=high,medium,low
这样 worker 会优先消费 high 队列里的任务(如支付回调),然后是 medium 里的欢迎任务,最后才处理 low 里的日志类任务。
3.1 不同优先级对比
| 队列名 | 权重 | 适用任务 |
|---|---|---|
| high | 5 | 支付、安全告警 |
| medium | 3 | 用户注册欢迎任务 |
| low | 1 | 统计数据、日志 |
四、注意事项
- 如果未指定
onQueue,任务会进入配置文件中的默认队列,通常是第一个队列(high),反而提高了优先级。 - 使用数据库驱动时,可在任务表加 priority 字段并改写 worker,但 Redis 权重法更简洁。
- 欢迎任务若失败,Laravel会自动重试,不会影响注册主流程。
小结:给Laravel用户注册欢迎任务设中等优先级,核心就是建 medium 队列、任务里调 onQueue('medium')、worker 启动时按 high,medium,low 顺序监听。