Laravel 队列提供了一套统一的 API 来处理异步任务,支持多种后端驱动如 Redis、数据库、Beanstalkd 等。
配置队列
在 .env 中设置队列驱动:
QUEUE_CONNECTION=redis
创建任务类
php artisan make:job SendEmailJob
class SendEmailJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public $user;
public function __construct(User $user)
{
$this->user = $user;
}
public function handle()
{
Mail::to($this->user->email)->send(new WelcomeMail());
}
}
分发任务
SendEmailJob::dispatch($user);
// 延迟执行
SendEmailJob::dispatch($user)->delay(now()->addMinutes(10));
// 指定队列
SendEmailJob::dispatch($user)->onQueue('emails');
运行队列工作者
php artisan queue:work
# 指定连接和队列
php artisan queue:work redis --queue=emails
# 后台运行
php artisan queue:work --daemon
失败任务处理
当任务失败时,Laravel 会自动将任务放入失败队列:
# 查看失败任务
php artisan queue:failed
# 重试失败任务
php artisan queue:retry 1
# 重试所有失败任务
php artisan queue:retry all
在任务类中自定义失败处理:
public function failed(Throwable $exception)
{
Log::error('邮件发送失败: ' . $exception->getMessage());
}
任务中间件
public function middleware()
{
return [new RateLimited('emails')];
}
监控
使用 Laravel Horizon(基于 Redis)可以可视化监控队列状态:
composer require laravel/horizon
php artisan horizon:install