Hướng dẫn hàng đợi trong php
Xin chào các bạn, trong bài viết lần này chúng ta sẽ cùng nhau tìm hiểu về hàng đợi (Queue) trong framework Laravel thông qua khái phần khái niệm, cách dùng, tác dụng thực tế của nó đối với trang web của các bạn nha . Show 1. Khái niệmHàng đợi (queue) là một danh sách những việc cần làm (job) được quản lý theo thứ tự. Khi chúng ta muốn thêm một công việc (job) vào hàng đợi, job phải implement interface Illuminate\Contracts\Queue\ShouldQueue. Hoạt dộng theo nguyên lý FIFO (first in first out), nghĩa là các công việc được đưa vào trước sẽ được xử lý trước. 2. Tác dụngTrong một trang web, một điều quan trọng sẽ ảnh hưởng đến trải nghiệm sử dụng đó chính là thời gian tải trang (page load), Nếu một trang web có tốc độ tải trang chậm sẽ gây ra cảm giác khó chịu, ức chế đến với người sử dụng. Một phần khiến cho thời gian tải trang tăng lên đó chính là do cách xử lý các tác vụ của trang web đó. Các bạn có thể nghĩ đến việc thay đổi logic xử lý cho tác vụ làm chậm trang web đó, hoặc là bỏ nó đi. Nhưng nếu trong trường hợp tác vụ đó đã được xử lý một các tối ưu và không thể bỏ đi thì các bạn sẽ làm thế nào? Đó đến là lúc các bạn nên sử dụng Queue, queue giúp chúng ta trì hoãn việc xử lý các tác vụ. 3. Các khái niệm cơ bảnMục đích cơ bản của Queue là vận hành các jobs (công việc) đã được thêm vào trong một queue (các tác vụ theo trình tự hàng đợi). Tiếp theo, queue có thể thuộc về một kết nối cụ thể và kết nối đó có thể thuộc về một queue driver cụ thể được cấu hình với chính kết nối đó. Chúng ta hãy cùng đi qua một số khái niệm nha: 3.1 Queue DriversGiống như các các bạn đã sử dụng một driver khác cho việc kết nối cơ sở dữ liệu, bạn có thể chọn từ nhiều queue driver khác nhau. Queue trong Laravel hỗ trợ các cổng kết nối khác nhau như database, beanstalkd, sqs, redis. Queue drivers là nơi được sử dụng để luuw trữ thông tin liên
quan đến queue. Ví dụ bạn chọn driver là 3.2 Queue ConnectionsKhi bạn cấu hình Queue lần đầu, bạn chỉ cần chỉ định một connection mặc định cần được sử dụng cho việc xử lý queue mặc định. Các connections của Queue các bạn có thể xem chi tiết tại file config/queue.php . 3.3 JobsJob trong queue là một tác vụ được hoãn lại từ luồng xử lý chính. Ví dụ khi bạn gửi mail cho người dùng, thì bạn có thể tạo riêng một job để xử lý phần gửi mail đó, bạn có thể trì hoãn tác vụ gửi mail tức thì bằng cách cho vào queue. 3.4 QueueKhi bạn thêm job vào queue thì các job đó sẽ được thêm vào queue mặc định. Trên thực
tế, điều đó vẫn giúp của bạn hoạt động tốt, trừ khi bạn muốn phân chia rõ các queue để thực hiện việc xử lý riêng biệt nhau. Ví dụ bạn vừa muốn xử lý việc gửi mail riêng và việc kiểm tra người dùng lâu không hoạt động thì bạn có thể tạo ra 2 queue riêng biệt có tên là
Còn nếu đặt trong các queue riêng biệt thì bạn cần chỉ định queue sẽ được chạy:
hoặc
4. Ví dụTiếp theo mình sẽ đưa ra một ví dụ về áp dụng queue trong gửi mail trên Laravel. Trong ví dụ, mình sẽ sử dụng queue driver =
Chúng ta có thể tạo bảng
Tiếp theo hãy chạy lệnh
Và chúng ta sẽ có class SendingEmail như sau
Tiếp theo chúng ta tạo ra một route để tiến hành gửi email trong file routes/web.php
Truy cập vào đường dẫn trên không thấy có lỗi, nhưng mail vẫn chưa có ư?? ?? . Đó là do bạn chưa chạy queue worker đó. Vào terminal và run command sau:
Terminal sẽ hiển thị như sau:
Chúng ta tiến hành kiểm tra hòm thư: Vậy là chúng ta đã gửi mail thành công bằng việc sử dụng Queue. Ngoài ra, nếu bạn không muốn gửi mail tức thì, bạn có thể trì hoãn nó bằng cách sau
Queue worker đồng thời cũng sẽ cung cấp cho bạn một vài lựa chọn như sau
Các lựa chọn:
Worker là một process tồn tại lâu dài, nên trong quá trình deploy, nó sẽ không tự nhận biết và thích nghi với sự thay đổi của source code, vì vậy bạn cần restart nó trong quá trình deploy, bằng lệnh:
5. Một số tài liệu tham khảohttps://laravel.com/docs/7.x/queues https://code.tutsplus.com/vi/tutorials/deferring-tasks-in-laravel-using-queues--cms-29957 Chúc các bạn học tập tốt, lao động tốt |