laravel 任务队列_laravel 基础教程 —— 队列

本文详细介绍了laravel框架的队列服务,包括配置、依赖、任务类的创建和处理,以及如何处理异常和任务的分发。laravel队列提供了一种延迟执行耗时任务的方式,以提高应用响应速度。队列驱动包括数据库、Beanstalkd、Amazon SQS、Redis等,任务类通过`handle`方法执行实际操作,支持异常捕获、任务释放和重试。laravel还提供了调度任务到不同队列、延迟任务执行、任务生命周期事件监听等功能。队列监听器可以通过`queue:listen`或`queue:work`命令运行,使用Supervisor进行进程管理。
摘要由CSDN通过智能技术生成

队列

简介

laravel 的队列服务对各种不同的后台队列服务提供了统一的 API。队列允许你延迟执行消耗时间的任务,比如发送一封邮件。这样可以有效的降低请求响应的时间。

配置

队列的配置文件被存储在 config/queue.php 中。在这个文件中你会发现框架所支持的队列驱动的配置连接示例。这些驱动包括:数据库,Beanstalkd,Amazon SQS,Redis,和一个同步(本地使用)的驱动。

还有一个名为 null 的驱动表明不使用队列任务。

队列先决条件

数据库

如果使用 database 队列驱动,你需要添加一个数据表来处理队列任务。你可以使用 queue:table Artisan 命令来生成一个迁移表。一旦该迁移表生成完成,你就可以使用 migrate 命令来迁移到数据库中:

php artisan queue:table

php artisan migrate

其他队列依赖

下面列出了其它队列驱动及其相应的依赖:

Amazon SQS: aws/aws-sdk-php ~3.0

Beanstalkd: pda/pheanstalk ~3.0

Redis: predis/predis ~1.0

编写任务类

生成任务类

默认的,所有的可队列执行的任务都被存储在 app/Jobs 目录下,你可以通过 Artisan 命令来生成一个新的队列任务:

php artisan make:job SendReminderEmail

该命令会在 app/Jobs 目录下生成一个新的类。该类会实现 Illuminate\Contracts\Queue\ShouldQueue 接口,该接口表明 laravel 应该将该任务添加到后台的任务队列中,而不是同步执行。

任务类结构

任务类是十分简单的,通常它只包含一个 handle 方法来在队列任务执行时被调用。我们来看一个简单的任务示例:

namespace App\Jobs;

use App\User;

use App\Jobs\Job;

use Illuminate\Contracts\Mail\Mailer;

use Illuminate\Queue\SerializesModels;

use Illuminate\Queue\InteractsWithQueue;

use Illuminate\Contracts\Queus\ShouldQueue;

class SendReminderEmail extends Job implements ShouldQueue

{

use InteractsWithQueue, SerializesModels;

protected $user;

/**

* Create a new job instance.

*

* @param User $user

* @return void

*/

public function __construct(User $user)

{

$this->user = $user;

}

/**

* Execute the job.

*

* @param Mailer $mailer

* @return void

*/

public function handle(Mailer $mailer)

{

$mailer->send('emails.reminder', ['user' => $this->user], function () {

//

});

$this->user->reminders()->create(...);

}

}

在这个例子中,你需要注意的是,我们可以直接的在队列任务的构造函数中传送一个 Eloquent 模型。因为我们引入了 SerializesModels trait,所以当队列任务执行时,Eloquent 模型会被优雅的序列化和反序列化。如果队列任务在构造器中接收了 Eloquent 模型,那么队列任务只会序列化模型的 ID。而在任务需要进行处理时,队列系统会从数据库中自动的根据 ID 检索出模型实例。这在应用中完全是透明的,这样就可以避免了序列化完整的模型可能在队列中出现的问题。

handle 方法会在队列任务执行时进行调用。你需要知道的是,我们可以在任务的 handle 方法中可以使用类型提示来进行依赖的注入。laravel 的服务容器会自动的将这些依赖注入进去。

有异常发生

如果任务进行的过程中有异常被抛出。它会自动的将任务释放,同时追加到队列的尾端以使任务可以进行再次尝试。该任务会被持续释放进行尝试除非尝试的次数超出了所设置的最大次数。你可以在队列监听器 queue:listen 或者

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值