Làm Chủ Laravel Task Scheduling
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ý.