Queue trong Laravel
1. Queue là gì?
Queue trong Laravel là hàng đợi, tức là những công việc mất quá nhiều thời gian để thực hiện thì sẽ cho nhưng công việc đó chạy ngầm dưới hệ thống, user sẽ nhận phản hồi ngay lập tức mà không phải chờ công việc đó hoàn thành. Kiểu đa luồng đó các bạn.
Lấy một ví dụ: bạn cho người dùng đăng ký tài khoản, sau khi đăng ký sẽ gửi mail chào mừng đến mail mà người dùng đăng ký, sau đó mới chuyển đến trang welcome. Như vậy nếu quá trình gửi mail bị lỗi thì sao, nếu thời gian gửi mail lên đến 2-3 phút thì sao, người dùng sẽ đợi load quá lâu. Vì thế với điều này chúng ta sẽ sử dụng queue, để khi đăng ký thì chuyển đến trang welcome luôn còn việc gửi mail sẽ cho vào hàng đợi.
2. Cài đặt Queue
Mình cần cấu hình file env, bạn tìm QUEUE_CONNECTION và sửa giá trị lại thành database nhé.
Nhớ nhé mình từng mất nhiều thời gian tự hỏi tại sao nó chạy luôn mà không vào hàng đợi, không vào jobs table. Đây là nguyên nhân đó.
QUEUE_CONNECTION=database
Để sử dụng được Queue với database thì bạn cần phải tạo bảng job.
//tạo migration php artisan queue:table //dùng migration đã tạo để tạo bảng trong csdl php artisan migrate
Tiếp theo bạn tạo cho mình job mới
php artisan make:job tenJobCuaBan
Khi đó bạn sẽ được một file App\Jobs\tenJobCuaBan.php việc của bạn là viết xử lý trong phương thức handle.
3. Sử dụng Queue
Ở nơi nào bạn muốn sử dụng thì bạn hãy khai báo nó trước.
use App\Jobs\tenJobCuaBan; //ví dụ use App\Jobs\NewJob;
Bạn muốn gọi job để xử lý.
NewJob::dispatch(); //hoặc $this->dispatch(new NewJob);
Như vậy khi bạn gọi đến job NewJob này thì nó sẽ được ghi vào database hàng đợi (bảng Jobs) cho chúng ta. Và để thực thi các hàng đợi đó ta dùng lệnh
php artisan queue:work
4. Những thắc mắc
#queue
Chào tất cả anh chị và các bạn trong nhóm. Mình có một thắc mắc về queue trong laravel nhờ mọi người gỡ giúp ạ. Queue trong laravel sẽ lưu lại các jobs của mình và khi có sự can thiệp của mình tức là chạy lệnh php artisan queue:work thì công việc mới được thực hiện. Vậy có cách nào khi có job thì nó tự động làm mà mình không cần phải can thiệp vào không ạ?
Ví dụ như khi đăng ký thành công thì job gửi mail sẽ làm việc liền và người dùng sẽ lập tức chuyển đến trang welcome mà không phải chờ đợi khoảng thời gian gửi mail này ạ.
Cảm ơn mọi người.
Link: https://www.facebook.com/groups/vietnam.laravel/permalink/1268196550237034/
Sau đó mình nhận được các câu trả lời rất hay:
- Event
- Linux:
Cronjob / Crontab
Stask Chedule
Supervisod - windows: nssm => phần mềm tạo server.
Ngày 27/01/2022, tui đọc lại bài này thấy mình lúc đó ngáo thật, không hiểu rõ về queue. Khi mình run lệnh php artisan queue:work là auto mọi queue được đưa vào job sẽ được thực hiện ngay lập tức, mình chỉ cần run lệnh 1 lần và để đó thôi, chớ không phải có queue mới lại phải chạy lệnh đó nhé. hihi
5. Lưu ý
Trên server sẽ bị giới hạn thời gian thực hiện queue.
Sử dụng lệnh sau để không bị giới hạn thời gian limit.
php artisan queue:listen --timeout=0
Kết Luận
Trên đây là toàn bộ về queue trong laravel. Các bạn cũng thấy đấy mình có khá nhiều thắc mắc nên mình cũng đã tìm hiểu và viết bài chia sẻ về nó. Bài viết Event trong Laravel mình đã có chia sẻ một trong những thắc mắc trên.