Làm Chủ Laravel Task Scheduling

· 3 min read

Trước đây, việc lập lịch tác vụ trên server yêu cầu thêm nhiều entries vào cấu hình crontab của server. Command Scheduler của Laravel cho phép bạn định nghĩa lịch trình commands một cách linh hoạt và biểu cảm ngay trong Laravel.

Kích Hoạt Scheduler

Bạn chỉ cần thêm một Cron entry duy nhất vào server để chạy scheduler mỗi phút:

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

Định Nghĩa Schedules

Bạn định nghĩa các scheduled tasks trong file routes/console.php (hoặc app/Console/Kernel.php trong các phiên bản Laravel cũ hơn).

Lập Lịch Artisan Commands

use Illuminate\Support\Facades\Schedule;

Schedule::command('emails:send')->daily();

Lập Lịch Closures

Schedule::call(function () {
    DB::table('recent_users')->delete();
})->daily();

Lập Lịch Shell Commands

Schedule::exec('node /home/forge/script.js')->daily();

Tần Suất Schedule

Laravel cung cấp rất nhiều tần suất:

  • ->everyMinute()
  • ->hourly()
  • ->daily()
  • ->dailyAt('13:00')
  • ->weekly()
  • ->monthly()
  • ->weekdays()

Ngăn Chặn Task Overlap

Mặc định, các scheduled tasks sẽ chạy ngay cả khi instance trước đó vẫn đang chạy. Để ngăn chặn điều này:

Schedule::command('emails:send')->withoutOverlapping();

Bạn cũng có thể chỉ định thời gian lock được duy trì (tính bằng phút):

Schedule::command('emails:send')->withoutOverlapping(10);

Chạy Tasks Trên Một Server

Nếu ứng dụng của bạn chạy trên nhiều servers, bạn không muốn cùng một job chạy trên tất cả chúng cùng lúc. Sử dụng onOneServer():

Schedule::command('report:generate')->fridays()->onOneServer();

Lưu ý: Điều này yêu cầu một cache driver tập trung như Redis hoặc Memcached.

Thực Thi Background

Để đảm bảo các tasks dài không blocking scheduler khỏi việc bắt đầu các tasks khác, thực thi chúng trong background:

Schedule::command('analytics:report')->daily()->runInBackground();

Scheduler của Laravel đưa sức mạnh tự động hóa trở lại codebase của bạn, giúp nó được version-controlled và dễ quản lý.

Bình luận