Quay lại

Tại sao bạn nên sử dụng Laravel Queues Chuyên mục PHP và Laravel    2023-07-26    1.4k Lượt xem    32 Lượt thích    comment-3 Created with Sketch Beta. 0 Bình luận

Tại sao bạn nên sử dụng Laravel Queues

Sẽ có lúc bạn không muốn người dùng cuối của mình nhìn chằm chằm vào màn hình trắng hoặc trình tải đáng sợ đó trong một thời gian dài. Ví dụ: Khi người dùng đăng ký vào trang web của bạn, bạn phải cấu hình trang web của mình để gửi email chào mừng hoặc email xác nhận khi đăng ký. Vì vậy, thao tác đó phải linh hoạt và vì mục đích đó, bạn thực sự muốn giảm lượng thời gian mà ứng dụng của bạn cần trong khi gửi email cho người dùng. Laravel Queues ra đời để xử lý loại nhiệm vụ tốn thời gian như vậy.

Hàng đợi Laravel là gì?

Hàng đợi của Laravel cung cấp một API thống nhất trên nhiều phần phụ trợ hàng đợi khác nhau, chẳng hạn như Beanstalk, Amazon SQS, Redis hoặc thậm chí là cơ sở dữ liệu quan hệ. Hàng đợi cho phép bạn trì hoãn việc xử lý một tác vụ tốn thời gian, chẳng hạn như gửi email, cho đến một thời điểm sau đó. Việc trì hoãn các tác vụ tốn thời gian này sẽ tăng tốc đáng kể các yêu cầu web tới ứng dụng của bạn.

Vì vậy, những gì mà Laravel Queues làm về cơ bản là, nó sắp xếp các nhiệm vụ tốn thời gian, tạo các công việc của chúng và gửi chúng khi chúng được dự định. Bằng cách này, người dùng sẽ không nhận thấy độ trễ trong trải nghiệm tổng thể của họ khi thực hiện thao tác tốn thời gian như vậy.

Tệp cấu hình hàng đợi được lưu trữ trong config/queue.php. Trong tệp này, bạn sẽ tìm thấy cấu hình kết nối cho từng hàng đợi có trong Laravel, bao gồm cơ sở dữ liệu, Beanstalkd, Amazon SQS, Redis và trình điều khiển đồng bộ sẽ thực thi công việc ngay lập tức (để sử dụng cục bộ). Trình điều khiển hàng đợi null cũng được bao gồm, đơn giản là loại bỏ các công việc được xếp hàng đợi.

Hãy lấy một ví dụ thực tế để tìm hiểu thêm về Laravel Queues.

Gửi email khi người dùng đăng ký

Ở đây trong ví dụ này, Chúng ta sẽ tạo một hàng đợi để gửi email chào mừng khi người dùng đăng ký vào trang web. Chúng ta sẽ sử dụng trình điều khiển hàng đợi "cơ sở dữ liệu" để tạo jobs trong trường hợp này. Đối với điều này, trước hết chúng ta cần tạo một bảng cơ sở dữ liệu sẽ chứa các công việc sắp được tạo. Để tạo một migration cho bảng này, hãy chạy lệnh php artisan queue:table Artisan. Khi quá trình di chuyển đã được tạo, bạn có thể di chuyển cơ sở dữ liệu của mình bằng lệnh migrate:

php artisan queue:table

php artisan migrate

Thao tác này sẽ tạo một bảng có tên là “jobs” có cấu trúc sau:

CREATE TABLE  `databaseName`.`jobs` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `queue` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `payload` longtext COLLATE utf8_unicode_ci NOT NULL,
  `attempts` tinyint(3) unsigned NOT NULL,
  `reserved` tinyint(3) unsigned NOT NULL,
  `reserved_at` int(10) unsigned DEFAULT NULL,
  `available_at` int(10) unsigned NOT NULL,
  `created_at` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  KEY `jobs_queue_reserved_reserved_at_index` (`queue`,`reserved`,`reserved_at`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Tạo một Mailable class

Bây giờ, chúng ta sẽ tạo một mailable class sẽ được sử dụng để gửi email. Lớp mailable chịu trách nhiệm gửi email bằng cách sử dụng trình gửi thư được định cấu hình trong tệp config/mail.php. Trên thực tế, Laravel đã cung cấp lệnh thủ công cho phép chúng ta tạo một template mẫu.

php artisan make:mail SendEmail

Điều đó sẽ tạo một mẫu email trống tại app/Mail/SendEmail.php, như được hiển thị trong đoạn mã sau.

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;

class SendEmail extends Mailable
{
    use Queueable, SerializesModels;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct()
    {


    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->view('emails.test');
    }
}

Tạo một queue job

Sau cái này, chúng ta sẽ cần tạo một queue job class để gửi email đăng ký. Chúng ta sẽ sử dụng lệnh artisan sau để tạo tệp  queue job với Queueable.

php artisan make:job SendRegisterEmail

Lệnh này sẽ tạo tệp SendRegisterEmail.php trong thư mục “Jobs”.

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 App\Mail\SendEmail;
use Mail;

class SendRegisterEmail implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $user;

    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct($user)
    {
        $this->user = $user;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        $email = new SendEmail();
        Mail::to($this->details['email'])->send($email);
    }
}

Bây giờ, chúng ta có thể tận dụng job này để gửi email khi người dùng đăng ký. Đối với điều này, hãy tạo một route đơn giản:

Route::get('email-test', function(){
	$user['email'] = 'test@test.com';

    dispatch(new App\Jobs\SendRegisterEmail($user));
});

Như bạn có thể thấy ở trên, để gửi job đã tạo, chúng ta cần sử dụng dispatch helper để gửi. Đối số duy nhất bạn cần chuyển đến dispatch helper điều phối là một instance của job.

Bạn thậm chí có thể trì hoãn gửi tác vụ bằng cách sử dụng phương pháp trì hoãn trên instance job của bạn. Phương thức trì hoãn được cung cấp bởi Illuminate\Bus\Queueable trait, được bao gồm theo mặc định trên tất cả các lớp job được tạo.

Ví dụ: Hãy chỉ định rằng một job sẽ không sẵn sàng để xử lý cho đến 10 phút sau khi nó được gửi đi. Bạn có thể làm được điều tương tự như dưới đây:

Route::get('email-test', function(){
	$user['email'] = 'test@test.com';

    $job = (new App\Jobs\SendRegisterEmail($user))
                    ->delay(Carbon::now()->addMinutes(10));

    dispatch($job);
});

kết thúc

Laravel Queues cực kỳ mạnh mẽ. Một trong những tác vụ mà bạn có thể sử dụng Hàng đợi là khi người dùng muốn tạo báo cáo và gửi chúng qua email. Nếu được sử dụng một cách chính xác, Hàng đợi là một công cụ tuyệt vời để hoàn thành các nhiệm vụ tốn nhiều thời gian. 

 
 
 

Bình luận (0)

Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough

Bài viết liên quan

Learning English Everyday