如何在Laravel 8中实现队列

325 阅读4分钟

在靠近用户的地方部署容器

本工程教育(EngEd)计划由科支持。

在全球范围内即时部署容器。Section是经济实惠、简单而强大的。

免费开始

如何在Laravel 8中实现队列

7月9日, 2021

公司在管理其服务或应用程序时可能会遇到许多挑战。例如,公司可能需要向数百万用户发送电子邮件或执行数据库备份。所有这些操作都需要大量的计算能力。

同时运行所有这些服务可能会影响应用程序的性能。因此, 用户可能会因为长时间的延迟而感到沮丧.Laravel试图通过使用队列来解决这个问题。

前提条件

要继续学习, 你需要在你的电脑上安装Laravel 8.拥有一些PHP和Laravel的知识也是至关重要的.在这个项目中,Laravel的关键组件是邮件工作

目标

在本教程结束时, 你应该能够通过延迟某些服务的运行来提高你的应用程序的性能.

什么是Laravel队列

一个队列涉及到将事情按顺序排列。例如, 一个队列管理系统可以用来为客户提供先到先得的服务.

这与Laravel队列没有区别。它通过确保程序或服务按照一定的顺序执行来完成同样的工作。

例如, 你有一个应用程序需要用户注册,然后给他们发送一个一次性密码(OTP),甚至是一个欢迎邮件。虽然这是一个很好的实现,但它可能会减慢应用程序的性能。Laravel队列可以帮助挽回这种情况。

让我们开始吧。

配置Laravel队列

Laravel提供了几个驱动,我们可以用它们来配置我们的队列。在本教程中, 我们将使用database driver

在这个项目中, 我们将专注于使用Laravel队列发送电子邮件.

首先,运行以下命令。

php artisan queue:table

输出。

Migration created successfully!

上面的命令设置了我们的应用程序,使用database driver 来实现队列。它还创建了我们的migration 文件和一个jobs 表。

这里是我们的migration 文件:

class CreateJobsTable extends Migration{

    // this method will create a database called jobs with its respective columns
    public function up(){
        Schema::create('jobs', function (Blueprint $table) { //we define our database columns here
            $table->bigIncrements('id');
            $table->string('queue')->index();
            $table->longText('payload');
            $table->unsignedTinyInteger('attempts');
            $table->unsignedInteger('reserved_at')->nullable();
            $table->unsignedInteger('available_at');
            $table->unsignedInteger('created_at');
        });
    }

    // this method is used to check if the table already exists
    public function down(){
        Schema::dropIfExists('jobs');
    }
}

我们还需要通知Laravel,我们将使用数据库驱动程序,更新.env 文件,如下所示。

QUEUE_CONNECTION=database

随着我们的jobs 表的准备,我们现在可以运行migrations ,如下图所示。

php artisan migrate

在运行上述migration 命令之前, 确保你的.env 文件有正确的数据库凭证以避免错误.

输出:

Migration table created successfully.
--------
Migrating: 2021_06_22_123248_create_jobs_table
Migrated:  2021_06_22_123248_create_jobs_table (117.97ms)

设置电子邮件以使用Laravel队列

在这一部分, 我们将使用mailable 类来设置我们的电子邮件.

让我们开始运行以下命令。

php artisan make: mail TestHelloEmail

输出。

Mail created successfully.

上面的命令在./app/Mail 目录下创建了一个TestHelloMail.php 文件.

下面是TestHelloMail.php 文件的内容。

<?php

class TestHelloEmail extends Mailable{
    use Queueable, SerializesModels;

    public function __construct(){
        //
    }

    public function build(){
        return $this->view('view.name'); // returns a view to the user
    }
}

由于我们已经创建了我们的mailable 类,导航到resources/views 文件夹,并创建一个名为mail 的新目录。

在这个文件夹中,创建一个新的文件,并将其命名为testEmails.blade.php

testEmails.blade.php 文件中包括以下HTML行。

    <p> My mailing queues testing</p>

现在,让我们更新一下TestHelloEmail.php 文件,如下图所示。

 public function build(){
        return $this->view('view.mail.testEmails');
 }

下一步是创建jobs 来管理我们的电子邮件。

这里我们可以使用以下命令。

  php artisan make:job TestSendEmail

输出。

 Job created successfully.

上述命令将在app/jobs/ 文件夹内创建一个testSendEmail.php 文件。

让我们更新其内容如下。

use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

class TestSendEmail implements ShouldQueue{

    public function __construct(){
        //
    }

    public function handle(){
         $email = new TestHelloEmail();
        Mail::to('johndoe@tests.com')->send($email);
    }
}

在上面的testSendEmail.php 文件中, 我们导入了Mail facade和TestHelloEmail.php 类来实现Laravel队列.

测试电子邮件

在这一步,我们需要添加一个controller 来处理我们的逻辑。

要做到这一点,我们使用以下命令。

php artisan make:controller TestQueueEmails

输出。

Controller created successfully.

打开生成的控制器,编辑如下。

class TestQueueEmails extends Controller
{
    /**
    * test email queues
    **/
    public function sendTestEmails()
    {
        $emailJobs = new TestSendEmail();
        $this->dispatch($emailJobs);
    }
}

然后在你的routes 文件中添加以下内容。

Route::get('sending-queue-emails', [TestQueueEmails::class,'sendTestEmails']);

当你导航到http://localhost:8000/sending-queue-emails ,你会发现jobs已经被添加到jobs 表中。

当我们想调度作业时,我们使用以下命令。

php artisan queue: work

结论

在本教程中, 我们已经讨论了使用一个简单的电子邮件发送器实现Laravel队列的过程.Laravel队列可以帮助开发人员提高用户满意度,只在应用程序不使用的时候运行复杂的服务。4

你可以使用这些知识来创建更强大的应用程序。

编码愉快!


同行评审贡献者::Wanja Mike