Cách sử dụng Cron Job trên Laravel 10

TN Duoc

Tự động hóa công việc lập lịch trong ứng dụng web Laravel có thể được thực hiện dễ dàng thông qua việc sử dụng “Cron Job”. Cron Job là một công cụ mạnh mẽ cho phép bạn thực hiện các tác vụ lặp lại định kỳ trên máy chủ của bạn. Trong bài viết này, chúng ta sẽ tìm hiểu cách sử dụng Cron Job trong Laravel để thực hiện các tác vụ tự động, ví dụ như gửi email định kỳ, cập nhật dữ liệu, và nhiều công việc khác.

Cron Job

1. Tìm hiểu về Cron Job

Trước khi chúng ta bắt đầu, hãy hiểu rõ về Cron Job là gì. Cron Job là một chương trình lên lịch trên hệ thống Unix/Linux, cho phép bạn thực hiện các tác vụ một cách tự động vào các thời điểm cố định hoặc định kỳ. Cron Job thường được sử dụng để tự động hóa các tác vụ hệ thống hoặc tác vụ ứng dụng.

2. Bắt đầu với Cron Job trong Laravel

2.1. Tạo một lớp Command

Trong Laravel, bạn có thể tạo một lớp Command để định nghĩa tác vụ bạn muốn thực hiện. Sử dụng lệnh artisan dưới đây để tạo một lớp Command mới:

php artisan make:command MyCronJob

Sau khi chạy lệnh này, Laravel sẽ tạo ra một file trong thư mục app/Console/Commands với tên là MyCronJob.php. Bây giờ, bạn có thể mở tệp này và định nghĩa logic cho tác vụ của bạn trong phương thức handle.

2.2. Định cấu hình Cron Job

Bây giờ, chúng ta sẽ cấu hình Cron Job để thực hiện lệnh artisan của chúng ta theo định kỳ. Mở tệp app/Console/Kernel.php và thêm một dòng trong mảng $commands để đăng ký lớp Command của bạn:

protected $commands = [
    // ...
    \App\Console\Commands\MyCronJob::class,
];

Tiếp theo, bạn cần thêm một dòng vào phương thức schedule của Kernel để thiết lập lịch cho Cron Job:

protected function schedule(Schedule $schedule)
{
    // Thực hiện lệnh Cron Job hàng ngày vào lúc 2 giờ sáng
    $schedule->command('my:cronjob')->dailyAt('02:00');
}

Trong ví dụ này, chúng ta đã đặt Cron Job để chạy hàng ngày vào 2 giờ sáng. Bạn có thể tùy chỉnh thời gian và tần suất thực hiện theo nhu cầu của bạn bằng cách áp dụng bảng miêu tả dưới đây.

->everyMinute();Chạy tác vụ mỗi phút
->everyFiveMinutes();Chạy tác vụ cứ năm phút một lần
->everyTenMinutes();Chạy tác vụ cứ sau mười phút
->everyFifteenMinutes();Chạy tác vụ cứ sau mười năm phút
->everyThirtyMinutes();Chạy tác vụ cứ sau ba mươi phút
->hourly();Chạy tác vụ mỗi giờ
->hourlyAt(17);Chạy tác vụ mỗi giờ vào lúc 17 phút
->daily();Chạy tác vụ hàng ngày vào lúc nửa đêm
->dailyAt(’13:00′);Chạy tác vụ vào lúc 13h hàng ngày
->twiceDaily(1, 13);Chạy tác vụ hàng ngày vào lúc 1h00 & 13h00
->weekly();Chạy tác vụ mỗi tuần
->weeklyOn(1, ‘8:00’);Chạy tác vụ vào thứ 3 hàng tuần lúc 8h00
->monthly();Chạy tác vụ hàng tháng
->monthlyOn(4, ’15:00′);Chạy tác vụ hàng tháng vào ngày 4 lúc 15h00
->quarterly();Chạy tác vụ mỗi quý
->yearly();Chạy tác vụ hàng năm
->timezone(‘America/New_York’);Đặt múi giờ

2.3. Chạy Cron Job

Bây giờ bạn đã định cấu hình Cron Job, bạn cần thêm một dòng vào tệp Crontab của máy chủ của mình để chỉ định khi nó sẽ chạy. Mở terminal và chạy lệnh sau:

crontab -e

Sau đó, thêm dòng sau vào Crontab:

* * * * * php /path-to-your-laravel-project/artisan schedule:run >> /dev/null 2>&1

Lưu ý rằng bạn cần phải thay thế path-to-your-laravel-project bằng đường dẫn thực tế đến thư mục gốc của dự án Laravel của bạn.

2.4. Kiểm tra và ghi log

Để kiểm tra xem Cron Job đã hoạt động chính xác hay không, bạn nên ghi log cho các tác vụ trong phương thức handle của lớp Command. Sử dụng Log facade trong Laravel để ghi thông tin vào tệp log hoặc cơ sở dữ liệu.

storage/logs/laravel.php

[2022-03-01 02:00:00] local.INFO: Cron Job running at 2022-03-01 02:00:00
[2022-03-02 02:00:00] local.INFO: Cron Job running at 2022-03-02 02:00:00 
[2022-03-03 02:00:00] local.INFO: Cron Job running at 2022-03-03 02:00:00

Bạn cũng có thể chỉ định tệp ghi log mà bạn muốn lưu.

$schedule->command('my:cronjob')->dailyAt('02:00')->appendOutputTo($filePath);

Bạn có thể vừa ghi ra log và gửi email

$schedule->command('my:cronjob')->dailyAt('02:00')->appendOutputTo($filePath)->emailOutputTo('cronlog@tora-tech.com);

2.5 Ngăn chặn việc thực hiện chồng chéo

Trong Laravel, để ngăn chặn thực hiện công việc chồng chéo trong Cron Job, bạn có thể sử dụng một cơ chế khóa (locking mechanism). Cơ chế này đảm bảo rằng chỉ một phiên làm việc của Cron Job được thực hiện vào một thời điểm cụ thể, và nếu một phiên khác cố gắng chạy trong khi phiên trước chưa hoàn thành, nó sẽ bị ngăn chặn bằng cách sử dụng withoutOverlapping

$schedule->command('my:cronjob')->dailyAt('02:00')->withoutOverlapping()->appendOutputTo($filePath)->emailOutputTo('cronlog@tora-tech.com);

hoặc bạn cũng có thể sử dụng Mutex

Laravel cung cấp một giao diện Mutex để quản lý khóa. Đầu tiên, bạn cần import Illuminate\Support\Facades\Mutex vào lớp Command của bạn.

use Illuminate\Support\Facades\Mutex;

Thêm Mutex trước khi thực hiện công việc: Trước khi bạn bắt đầu thực hiện công việc trong phương thức handle của lớp Command, bạn nên thêm một Mutex để kiểm tra xem có phiên làm việc khác đang chạy không.

public function handle()
{
    if (!Mutex::acquire('my:cronjob')) {
        // Công việc đang chạy, bạn có thể thoát hoặc xử lý tùy ý
        $this->info('The cron job is already running.');
        return;
    }

    // Thực hiện công việc của bạn ở đây

    Mutex::release('my:cronjob');
}

Trong ví dụ này, chúng ta sử dụng Mutex có tên ‘my:cronjob‘ để kiểm tra xem công việc đã được khởi động từ trước chưa. Nếu Mutex đã được khóa bởi một phiên làm việc khác, chúng ta sẽ hiển thị thông báo và thoát khỏi phương thức handle. Nếu không, chúng ta sẽ thực hiện công việc và sau đó giải phóng Mutex khi công việc hoàn thành.

3. Kết luận

Sử dụng Cron Job trong Laravel là một cách mạnh mẽ để tự động hóa các tác vụ trong ứng dụng web của bạn. Bài viết này đã hướng dẫn bạn cách tạo, cấu hình và chạy Cron Job trong Laravel. Điều này giúp bạn duy trì và quản lý ứng dụng của mình một cách hiệu quả hơn, giảm tải cho người dùng và giúp đảm bảo tính ổn định của ứng dụng.

Các bạn có thể tham khảo thêm các bài viết về Laravel:

HƯỚNG DẪN CÀI ĐẶT LARAVEL TRÊN AMAZON LINUX (EC2)
SỬ DỤNG SWAGGER VỚI LARAVEL: TẠO API DOCUMENTATION DỄ DÀNG HƠN
DÙNG THỬ API OPENAI BẰNG LARAVEL V9.19

Viết một bình luận