Tạo cron job trong Laravel 5

Giới thiệu

Trong thực tế khi triển khai dự án, bạn có thể phải thực hiện những tác vụ lặp đi lặp lại vào 1 thời điểm nhất định, ví dụ như gửi mail, xóa file rác, hay backup dữ liệu hệ thống….Trong Laravel cung cấp cho chúng ta một cách thức hết sức đơn giản để thực hiện điều này, đó là cron job. Tất cả các tác vụ cần thực hiện sẽ được đặt trong method schedule của class app/Console/Kernel.php.

Thực hiện

Ta hãy bắt đầu một ví dụ đơn giản sau đây

Mở file app/Console/Kernel.php và thêm vào trong method schedule câu lệnh sau để cứ 5 phút thì nó sẽ ghi ra file log 1 lần

Mở command lên và gõ lệnh

Kiểm tra file log ta sẽ thấy nó ghi ra dòng “test schedule”. Tuy nhiên nếu chờ đợi 5 phút sau thì không có gì xảy ra nữa vì ta mới chỉ cho nó chạy có 1 lần, để task này có thể chạy cứ 5 phút một lần thì ta phải lặp nó liên tục

Ok. như vậy cứ 5 phút một lần task ghi log trên sẽ được chạy.

Ở trên chỉ là cách thức thực thi câu lệnh bằng closure. Ngoài ra còn rất nhiều cách khác nữa như sau

Thiết lập thời gian

Laravel cung cấp 1 số phương thức để thiết lập thời gian chạy của task

Phương thức Mô tả
->cron('* * * * *'); 1 phút 1 lần
->everyFiveMinutes(); Chạy 5 phút một lần
->everyTenMinutes(); Chạy 10 phút 1 lần
->everyThirtyMinutes(); Chạy 30 phút một lần
->hourly(); Chạy 1 tiếng 1 lần
->daily(); Chạy lúc nửa đêm
->dailyAt('13:00'); Chạy hàng ngày lúc 13:00
->twiceDaily(1, 13); Chạy 2 lần 1 ngày lúc 1:00 & 13:00
->weekly(); Chạy hàng tuần
->monthly(); Chạy hàng tháng

Ngoài ra chúng ta cũng có thể kết hợp thêm 1 số điều kiện nâng cao khác để thiết lập chạy vào 1 ngày nào đó cụ thể

Một số phương thức ràng buộc về ngày tháng

Phương thức Giới thiệu
->weekdays(); Tất cả các ngày trong tuần ngoại trừ chủ nhật
->sundays(); Chủ nhật
->mondays(); Thứ 2
->tuesdays(); Thứ 3
->wednesdays(); Thứ 4
->thursdays(); Thứ 5
->fridays(); Thứ 6
->saturdays(); Thứ 7

Không cho thực thi chồng chéo

Nếu muốn không cho chạy task nếu task chạy trước đó chưa xong thì chúng ta sử dụng phương thức withoutOverlapping

Trong ví dụ trên thì task gửi mail chỉ được chạy nếu như việc gửi mail trước đó đã hoàn tất.

Task output

Laravel cung cấp 1 số phương thức rất thuận tiện để báo cáo nhiệm vụ hoàn thành của các task. Chúng ta có thể sử dụng phương thức  sendOutputTo hoặc emailOutputTo

Lưu ý rằng 2 phương thức sendOutputTo và emailOutputTo chỉ hỗ trợ cho các task được gọi bằng lệnh command chứ không hỗ trợ phương thức call

Task Hooks

Bằng cách sử dụng phương thức before và after, ta có thể chỉ định các đoạn lệnh được chạy trước và sau của các task

Phần 2 http://apollo13.vn/lap-trinh/php/laravel/tao-cron-job-trong-laravel-5-phan-2.html