在靠近用户的地方部署容器
本工程教育(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