Hướng dẫn sử dụng Cron Job trong Laravel 5.8
Câu hỏi đặt ra tại sao chúng ta phải dùng Cron Job? Đơn giản vì nhiều khi chúng ta cần gửi thông báo hoặc gửi email tự động cho người dùng để cập nhật các property hoặc products. Vì vậy, tại thời điểm đó, bạn có thể xác định một số logic cơ bản cho mỗi ngày, giờ,… có thể chạy và ...
Câu hỏi đặt ra tại sao chúng ta phải dùng Cron Job? Đơn giản vì nhiều khi chúng ta cần gửi thông báo hoặc gửi email tự động cho người dùng để cập nhật các property hoặc products. Vì vậy, tại thời điểm đó, bạn có thể xác định một số logic cơ bản cho mỗi ngày, giờ,… có thể chạy và gửi email. Bài viết hôm nay mình sẽ hướng dẫn sử dụng Cron Job trong Laravel 5.8 các bạn nhé.
Tạo Command
Đầu tiên chúng ta cần tạo các lệnh tùy chỉnh. Các lệnh tùy chỉnh sẽ thực thi với các cron job trên task scheduling.
Ở đây mình sẽ ví dụ về việc update trạng thái của chứng thư số. Mỗi ngày sẽ kiểm tra xem những chứng thư nào đã hết hạn và chuyển trang thái cho nó:
1 2 3 |
php artisan make:command UpdateStatus --command=status:update |
1 file command được tạo trong file app/Console/Commands/StatusUpdate.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
class StatusUpdate extends Command { /** * The name and signature of the console command. * * @var string */ protected $signature = 'status:update'; /** * The console command description. * * @var string */ protected $description = 'Command description'; /** * Create a new command instance. * * @return void */ public function __construct() { parent::__construct(); } /** * Execute the console command. * * @return mixed */ public function handle() { // } } |
Phần xử lý việc update chứng thư sẽ được viết vào trong function handle() như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public function handle() { $certificates = $this->certificate->getData(['user'], ['status' => 0]); foreach ($certificates as $cert) { if (strtotime($cert->valid_to_time) < strtotime(Carbon::now())) { $this->certificate->update($cert->id, ['status' => 1]); $cert->delete(); } } $this->info('status:update Command Run successfully!'); } |
Đăng ký trên Task Scheduler
Tiếp theo chúng ta cần xác định thời gian để chạy các command trong trong file Kernel.php.
Ở ví dụ này mình cho chạy vào lúc 0h hằng ngày nên sẽ dùng daily().
Vào app/Console/Kernel.php để cấu hình:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
class Kernel extends ConsoleKernel { /** * The Artisan commands provided by your application. * * @var array */ protected $commands = [ CommandsStatusUpdate::class, ]; /** * Define the application's command schedule. * * @param IlluminateConsoleSchedulingSchedule $schedule * @return void */ protected function schedule(Schedule $schedule) { $schedule->command('status:update') ->daily(); } /** * Register the commands for the application. * * @return void */ protected function commands() { $this->load(__DIR__.'/Commands'); require base_path('routes/console.php'); } } |
Bây giờ cron job bằng lệnh:
1 2 3 |
php artisan schedule:run |
Cuối cùng để nó có thể chạy tự động, ta đặt lịch thực hiện cho từng hệ điều hành riêng. Ở đây mình dùng HĐH Linux nên lệnh sẽ là:
1 2 3 4 5 |
* * * * * php /path/to/artisan schedule:run 1>> /dev/null 2>&1 OR * * * * * cd /đuong-dan-den-project && php artisan schedule:run >> /dev/null 2>&1 |
Tổng kết
Vậy là mình đã hướng dẫn sử dụng Cron Job trong Laravel 5.8 cho các bạn trong bài viết này. Hy vọng các bạn sẽ thấy bổ ích. Cảm ơn các bạn đã theo dõi bài viết!
Nguồn tham khảo:
https://itsolutionstuff.com/post/task-scheduling-with-cron-job-in-laravel-58example.html
Có thể bạn quan tâm:
- Hướng dẫn tối ưu Laravel cho lập trình viên
- Tại sao Laravel là framework tốt nhất 2019?
- Sử dụng Laravel Mix với Webpack cho tất cả các assets
Xem thêm viêc làm PHP Developer trên TopDev
TopDev via viblo.asia