Hỏi về Schedule Task trong Laravel?
Xin chào mọi người.
Hiện tại mình đang có một chức năng là vào mỗi ngày cứ đúng 3h sáng thì sẽ backup lại data trên server và server mình đang dùng là linux. Sau khi tìm hiểu thì có trong Laravel có hỗ trợ lên lịch tự động bằng Task Schedule. Khi research thì mình biết được Laravel không thể tự động chạy tác vụ đã lên lịch trước mà phải thông qua crontab của Linux hoặc Windows Task Scheduler trong Window.
Điều mình thắc mắc là đã tạo lịch cho crontab trên server vào 3h sáng mỗi ngày thì có cần tạo thêm lịch trong Schedule của Laravel không?
Tại sao trong phần đặt lịch của Hệ điều hành chúng ta đã thực hiện đặt lịch nhưng trong Task Scheduling của Laravel chúng ta lại đặt lịch tiếp? Cái nào ưu việt hơn?
2 CÂU TRẢ LỜI
Trong docs laravel phần Task Scheduling có đầu đủ thông tin.
Về cơ bản bạn sẽ viết các Task(Command, Job...) ngay bên trong laravel từ việc chọn chạy lúc nào đến chạy ntn. Mọi thứ đều định nghĩa như ở dưới đây.
Tham khảo: https://laravel.com/docs/8.x/scheduling#defining-schedules
Tuy nhiên bạn cần phải định nghĩa 1 crontab duy nhất để giúp chạy những scheduler đã định nghĩa sẵn:
* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1
=> đại khái mỗi phút nó sẽ check 1 lần và kiểm tra các schedule bạn đã viết trong laravel, cái nào mà đến giờ thì nó run thôi. Tham khảo: https://laravel.com/docs/8.x/scheduling#running-the-scheduler
Tổng kết: Có thể hiểu rằng để tạo lịch chạy task bạn hãy viết trong laravel, để check/chạy cái lịch đó thì cần config 1 crontab duy nhất như ở trên.
Cảm ơn bạn đã chia sẻ, về cơ bản mình đã hiểu những gì bạn trình bày. Nhưng mình có thêm một thắc mắc đó là chức năng của mình ở trên mỗi ngày sẽ chạy một lần thì nếu đặt lịch trong crontab mỗi phút nó sẽ chạy để thực hiện các command trong Scheduling thì có phải không được tối ưu đúng không ạ?
@minhtien020900 mỗi phút nó sẽ check xem có task nào cần chạy ko chứ ko phải là mỗi phút nó đều sẽ thực hiện chạy các command trong Scheduling.
còn về tối ưu thì không có cách khác, ví dụ điển hình là một app báo thức trên điện thoại đi, bản chất là nó cũng sẽ check mỗi phút 1 lần xem có cái báo thức nào bạn setup đến giờ ko, nếu đến giừo thì đt bạn sẽ kêu. việc check này là bắt buộc. còn việc check thì cũng ko mất quá nhiều thời gian cũng như tài nguyên vì đơn giản nó chỉ check xem đến giờ để chạy task hay ko. nên bạn ko cần suy nghĩ quá nhiều.
Theo mình biết thì bạn nên đặt lịch trong Task Scheduling cho dễ quản lý vì nếu server của bạn chạy nhiều project mà tất cả các job trong crontab thì khi muốn sửa một job của một project nào đó ta sẽ phải vào crontab để tìm. Nếu crontab có nhiều job từ nhiều project thì điều này sẽ gây khó khăn trong việc quản lý. Thay vì thế ta sẽ đặt lịch trong Task Scheduling của từng project để dễ dàng quản lý hơn.
Nhưng vẫn phải đặt trong crontab một cronjob thì nó mới gọi được cái Task Scheduling trong Laravel đúng không ạ? Theo như chức năng mình đang làm thì sẽ cần một cronjob vào 3h mỗi ngày, vì chức năng này chỉ gọi mỗi ngày một lần nên không cần đặt thêm lịch trong Scheduling thì có được không ạ?