12/08/2018, 14:02

Tìm hiểu về Queues trong Laravel

Queues là gì ? Queues là một background jobs được sử dụng vô cùng phổ biến hiện nay . Nó cho phép giúp cho chúng ta quản lý một Jobs được dễ dàng hơn theo ý muốn của mình. Chúng ta sử dụng queue để quản lý các Jobs qua các hàm release() , delay() , attempts() ... Để hiểu rõ hơn chúng ta sẽ ...

Queues là gì ?

Queues là một background jobs được sử dụng vô cùng phổ biến hiện nay . Nó cho phép giúp cho chúng ta quản lý một Jobs được dễ dàng hơn theo ý muốn của mình. Chúng ta sử dụng queue để quản lý các Jobs qua các hàm release() , delay() , attempts()... Để hiểu rõ hơn chúng ta sẽ đi sâu hơn ở phần dưới đây.

1.Cài đặt một Queues

File cấu hình của Queues được lưu trong config/queue.php

Đầu tiên, chúng ta sẽ cần một bảng để lưu trữ thông tin về jobs. Chúng ta chỉ cần thực thi câu lệnh sau để tạo file migration cho việc tạo bảng :

php artisan queue:table
php artisan queue migration

Ta có các dependency cần thiết cho từng queue driver tương ứng :

- Amazon SQS: aws/aws-sdk-php ~3.0
- Beanstalkd: pda/pheanstalk ~3.0
- Redis: predis/predis ~1.0

Trước hết ta muốn tạo một Job Classes

Về mặc định , tất cả các job được lưu trong thư mục app/Jobs và class sẽ triển khai interface IlluminateContractsQueueShouldQueue .Ta tạo một job mới sử dụng câu lệnh :

php artisan make:job SendReminderEmail

Ta sẽ có class dưới đây , ví dụ đây là một Jobs gửi mail để nhắc nhở:

    use Auth;

    class SendReminderEmail extends Job implements ShouldQueue
    {
        use InteractsWithQueue, SerializesModels;
        protected $user;
        protected $order;
        /**
         * Create a new job instance.
         *
         * @return void
         */
        public function __construct(User $user, Order $order)
        {
            $this->user = $user;
            $this->order = $order;
        }

        /**
         * Execute the job.
         *
         * @return void
         */
        public function handle(Mailer $mailer)
        {
            $mailer->send('emails.reminder', [
                'user' => $this->user,
                'order' => $this->order
            ], function ($message) {
                $message->from('foods.and.drinks.2@gmail.com', 'Remider');
                $message->to('nguyenthanhloan1902@gmail.com');
            });
         }
     }

Hàm handle được gọi khi job được queue xử lý . Ở ví dụ này ta muốn send một mail nhắc nhở từ hệ thống bán hàng đến người quản trị là đã có người đặt hàng thành công .

    public function handle(Mailer $mailer)
    {
       $mailer->send('emails.reminder', [
           'user' => $this->user,
           'order' => $this->order
       ], function ($message) {
           $message->from('foods.and.drinks.2@gmail.com', 'Remider');
           $message->to('nguyenthanhloan1902@gmail.com');
       });
     }

Nếu bạn muốn release job , trait InteractsWithQueue có sẵn trong job class cho phép gọi hàm release trong queue job . Hàm release nhận một tham số là số giây bạn muốn chờ tới khi job có hiệu lực trở lại lần nữa. Ví dụ, ta muốn đẩy công việc này vào queue sử dụng hàm dispatch và muốn relase trong 10s thì job mới có hiệu lực :

    if ($order->status == 0)
    {
       $user = User::findOrFail(Auth::user()->id);
       $this->dispatch((new SendReminderEmail($user, $order))->release(10));
    }

Hoặc bạn có thể dùng hàm delay để có thể trì hoãn công việc trong vòng bao nhiêu giây bạn muốn. Ví dụ bạn muốn đặt hàng thành công sau 10s thì sẽ có mail thông báo được gửi đến :

    if ($order->status == 0)
    {
       $user = User::findOrFail(Auth::user()->id);
       $this->dispatch((new SendReminderEmail($user, $order))->delay(10));
    }

Ngoài ra , bạn có thể dùng hàm attempts() để kiểm tra số lần thử được thực hiện.

2.Thực thi một queue

Laravel có chứa một câu lệnh Artisan mà sẽ chạy các job mới khi chúng ta đưa vào queue. Bạn có thể chạy listener sử dụng lệnh queue:listen :

php artisan queue:listen
  • Bạn cũng có thể chỉ định queue connection nào mà listener nên xử lý:

      php artisan queue:listen connection-name
    
  • Chúng ta cũng có thể thiết lập độ ưu tiên cho queue . Ví dụ , một Jobs sendMails sẽ có độ ưu tiên hơn Jobs reminderMails , ta sử dụng câu lệnh

      php artisan queue:listen --queue = sendMails, reminderMails
    

được ngăn cách với nhau bằng dấu ", " giữa các Jobs

  • Chỉ định thời gian mà mỗi Job được phép chạy

      php artisan queue:listen --timeout = 60
    
  • Chỉ định thời gian sleep trước khi chạy job mới :

      php artisan queue:listen --sleep = 5
    

Hi vọng ở bài viết này có thể giúp các bạn hiểu thêm về queue với framwork Laravel . Nếu có ý kiến gì thì mong mọi người góp ý ở comment dưới đây nhé ! Thank you             </div>
            
            <div class=

0