Trong bài trước chúng ta đã tìm hiểu về gửi mail trong Laravel, nếu bạn đã thực hiện thì chắc hẳn bạn biét đó là một tiến trình rất lâu và mất thời gian. Vì thế  Laravel Framework đã cung cấp API Queue , nó cho phép bạn trì hoãn các tác vụ tốn nhiều tài nguyên trong quá trình thực hiện mã lệnh để nâng cao trải nghiệm tổng thể cho người dùng cuối. Bài viết ngày hôm nay mình sẽ giới thiệu cho các bạn về Queue Laravel

Queue là gì?

Queue trong Laravel thực chất là một hàng đợi chứa các tác vụ cần xử lý, tác vụ nào đưa vào trước sẽ được xử lý trước, tác vụ nào đưa vào sau sẽ được xử lý sau. Và quan trọng nhất là Queue trong Laravel có thể chạy ngầm.

Chạy ngầm ở đây tức là nó không yêu cầu người dùng phải đợi.Ví dụ:  Bạn phải gửi  100 email, người dùng phải đợi 100 giây để hệ thống thực hiện gửi lần lượt từng email một. Tức là sau 100 giây, người dùng mới nhận được phản hồi từ hệ thống. Nhưng khi áp dụng Queue, người dùng chỉ mất 1 giây là nhận được phản hồi ngay. Tuy nhiên lúc người dùng nhận được phản hồi, thì hệ thống chưa hề thực hiện các tác vụ gửi mail, mà chúng mới chỉ được đưa vào Queue (hàng đợi), và trong trạng thái sẵn sàng để gửi.

Đặc điểm của Queue

Các tác vụ được xử lý bằng Queue có một vài ưu điểm như sau:

- Do các tác vụ có thể chạy ngầm, và chạy sau khi hệ thống đã phản hồi, nên không yêu cầu user phải đợi lâu.

- Chỉ khi hệ thống rỗi, các tác vụ trong Queue mới được thực hiện, điều này giúp dự án của bạn chạy mượt mà hơn trong các giờ cao điểm.

Cách sử dụng queue trong Laravel

Queue là một trong những thành phần của Laravel, vì vậy mà sử dụng Queue trong Laravel vô cùng đơn giản.

Bước 1: Mở file .env tìm dòng QUEUE_DRIVER=sync đổi thành

QUEUE_DRIVER=database

Bước 2: Thực hiện lần lượt các command sau

php artisan queue:table 
php artisan migrate 

Bước 3: Chạy command sau thực hiện các tác vụ có trong Queue

php artisan queue:work

Gửi mail bằng Queue trong Laravel

Chú ý: Tài khoản nhận email của bạn phải là tài khoản mailtrap.io . Nó cung cấp dịch vụ giả lập máy chủ STMP chuyên dùng để test, hoặc phát triển các tính năng liên quan tới việc gửi mail.

Tài khoản mailtrap.io có thể đăng ký dễ dàng bằng tài khoản github hoặc tài khoản google (gmail).

Thiết lập

Các bạn chạy lần lượt các command dưới đây:

php artisan make:controller MailController
php artisan make:mail TestMail
php artisan make:job SendEmail

B1: Mở App\Mail\TestMail và thêm các nội dung sau:

<?php

 
namespace App\Mail;
 
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
 
class TestMail extends Mailable
{
    use Queueable, SerializesModels;
 
    public function build()
    {
        return $this
            ->from('[email protected]')
            ->view('mails.test');
    }
}

 

B2: Tạo file resources/views/mails/test.blade.php với nội dung:

 

Test message

B3: Mở App\Jobs\SendEmail  và thêm các nội dung:

<?php

 
namespace App\Jobs;
 
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Mail;
 
class SendEmail implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
 
    protected $mail;
 
    public function __construct($mail)
    {
        $this->mail = $mail;
    }
 
    public function handle()
    {
        Mail::send($this->mail);
    }
}

 

B4: Trong App\Http\Controllers\MailController xóa hết nội dung và thay thế bằng:

<?php

 
namespace App\Http\Controllers;
 
use Illuminate\Http\Request;
use App\Jobs\SendEmail;
use App\Mail\TestMail;
 
class MailController extends Controller
{
    public function test()
    {
        $startTime = microtime(true);
 
        for ($i = 0; $i < 100; $i++) {
            $testMail = new TestMail();
            $sendEmailJob = new SendEmail($testMail);
            dispatch($sendEmailJob);
        }
 
        $endTime = microtime(true);
        $timeExecute = $endTime - $startTime;
 
        return "Done. Time execute: $timeExecute";
    }
}

 

B5: Mở routes/web.php, thêm route sau:

Route::get('/test', '[email protected]'); 

B6: Khởi động queue bằng command sau:

php artisan queue:work

Khởi động Laravel serve bằng command sau:

php artisan serve

Sau đó truy cập vào: http://localhost:80/test để bắt đầu gửi mail bằng queue.

Khi đó các Job gửi mail đã được đưa vào Queue và đang chờ để thực hiện, bạn có thể quay trở lại terminal – nơi đang chạy lệnh queue:work để thấy tiến trình các Job đang chạy. Cứ mỗi Job chạy thành công, thì ở bên mailtrap.io bạn sẽ nhìn thấy một mail mới

Tổng kết:

Bài viết ngày hôm nay mình đã giới thiệu cho các bạn về Queue trong Laravel và cách sử dụng Queue để gửi email .Trong các dự án, việc gửi email cũng rất thường xuyên xảy ra. Cảm ơn các bạn đã theo dõi và chúc các bạn làm việc tốt với Queue.