Skip to content

Lập lịch (Task Scheduling)

Giới thiệu (Introduction)

Trước đây để lập lịch tác vụ, bạn phải tạo cron entry cho mỗi task trên server. Laravel Scheduler cho phép định nghĩa command schedule ngay trong Laravel — chỉ cần một cron entry duy nhất trên server:

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

Định nghĩa Schedules

Trong routes/console.php:

php
use Illuminate\Support\Facades\Schedule;

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

Closure Schedules

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

Artisan Commands

php
Schedule::command('emails:send Taylor --force')->daily();
Schedule::command(EmailsCommand::class, ['Taylor', '--force'])->daily();

Queued Jobs

php
use App\Jobs\Heartbeat;

Schedule::job(new Heartbeat)->everyFiveMinutes();
Schedule::job(new Heartbeat, 'heartbeats', 'sqs')->everyFiveMinutes();

Shell Commands

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

Tần suất (Frequency Options)

MethodMô tả
->cron('* * * * *')Custom cron expression
->everySecond()Mỗi giây
->everyMinute()Mỗi phút
->everyTwoMinutes()Mỗi 2 phút
->everyFiveMinutes()Mỗi 5 phút
->everyTenMinutes()Mỗi 10 phút
->everyFifteenMinutes()Mỗi 15 phút
->everyThirtyMinutes()Mỗi 30 phút
->hourly()Mỗi giờ
->daily()Mỗi ngày lúc nửa đêm
->dailyAt('13:00')Mỗi ngày lúc 13:00
->twiceDaily(1, 13)Mỗi ngày lúc 1:00 và 13:00
->weekly()Mỗi tuần
->monthly()Mỗi tháng
->quarterly()Mỗi quý
->yearly()Mỗi năm

Ràng buộc (Constraints)

php
Schedule::command('emails:send')
    ->hourly()
    ->weekdays()           // Chỉ ngày trong tuần
    ->between('8:00', '17:00'); // Chỉ 8h-17h

Schedule::command('emails:send')
    ->hourly()
    ->unlessBetween('23:00', '4:00'); // Trừ 23h-4h

Schedule::command('emails:send')
    ->daily()
    ->environments(['staging', 'production']);

Ngăn chồng chéo (Preventing Overlaps)

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

// Với thời gian lock hết hạn
Schedule::command('emails:send')->withoutOverlapping(10); // 10 phút

Chạy trên một Server (Running on One Server)

php
Schedule::command('report:generate')
    ->fridays()
    ->at('17:00')
    ->onOneServer();

Background Tasks

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

Maintenance Mode

php
Schedule::command('emails:send')->evenInMaintenanceMode();

Chạy Scheduler

Development

bash
php artisan schedule:work

Xem danh sách scheduled tasks

bash
php artisan schedule:list

Output

php
Schedule::command('emails:send')
    ->daily()
    ->sendOutputTo($filePath);

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

Schedule::command('emails:send')
    ->daily()
    ->emailOutputTo('taylor@example.com');

Task Hooks

php
Schedule::command('emails:send')
    ->daily()
    ->before(function () {
        // Trước khi task chạy...
    })
    ->after(function () {
        // Sau khi task chạy...
    })
    ->onSuccess(function () {
        // Task thành công...
    })
    ->onFailure(function () {
        // Task thất bại...
    });

Ping URLs

php
Schedule::command('emails:send')
    ->daily()
    ->pingBefore($url)
    ->thenPing($url)
    ->pingOnSuccess($successUrl)
    ->pingOnFailure($failUrl);