Laravel Scheduler: Menjalankan Task Otomatis dengan Laravel Task Scheduling

Aplikasi Laravel sering membutuhkan proses yang berjalan secara otomatis berdasarkan waktu tertentu.

Misalnya:

  • Menghapus data yang sudah kedaluwarsa
  • Mengirim laporan harian
  • Membersihkan file temporary
  • Mengirim notifikasi
  • Memproses data secara berkala
  • Menjalankan command tertentu setiap beberapa menit

Tanpa scheduler, kita biasanya harus membuat cron job untuk setiap proses secara terpisah.

Laravel menyediakan Task Scheduling untuk membuat jadwal tersebut langsung di dalam aplikasi. Kita cukup mendefinisikan kapan sebuah task harus dijalankan, kemudian server menjalankan scheduler Laravel secara berkala.

Apa Itu Laravel Scheduler?

Laravel Scheduler adalah fitur Laravel untuk mengatur pekerjaan yang harus dijalankan berdasarkan jadwal tertentu.

Misalnya kita ingin menjalankan sebuah command setiap hari:

Setiap hari
     ↓
Laravel Scheduler
     ↓
Jalankan Task

Daripada menyimpan banyak konfigurasi cron di server, jadwal pekerjaan dapat didefinisikan di dalam project Laravel.

Contohnya:

Schedule::call(function () {
    // Task yang ingin dijalankan
})->daily();

Laravel menyediakan berbagai frekuensi seperti daily(), hourly(), everyMinute(), dan lainnya.

Contoh Penggunaan

Misalnya aplikasi memiliki data yang sudah tidak diperlukan dan ingin dibersihkan setiap hari.

Kita bisa membuat scheduled task:

Schedule::call(function () {
    // Hapus data lama
})->daily();

Atau menjalankan command Laravel:

Schedule::command('app:cleanup')->daily();

Dengan pendekatan ini, logic jadwal tetap berada di dalam project Laravel.

Membuat Scheduled Task

Pada Laravel versi modern, konfigurasi scheduler dapat ditemukan di:

routes/console.php

Misalnya:

use Illuminate\Support\Facades\Schedule;

Schedule::call(function () {
    // Proses yang ingin dijalankan
})->daily();

Jika ingin menjalankan task setiap menit:

Schedule::call(function () {
    // Proses
})->everyMinute();

Untuk menjalankan task setiap jam:

Schedule::call(function () {
    // Proses
})->hourly();

Menjalankan Artisan Command

Scheduler juga dapat digunakan untuk menjalankan Artisan Command.

Misalnya aplikasi memiliki command:

php artisan make:command CleanupData

Setelah command dibuat, kita dapat menjadwalkannya:

Schedule::command('app:cleanup-data')->daily();

Atau menggunakan waktu tertentu:

Schedule::command('app:cleanup-data')
    ->dailyAt('01:00');

Dengan demikian command akan dijalankan setiap hari pada pukul 01:00.

Menjalankan Scheduler di Server

Membuat jadwal saja belum cukup. Server tetap perlu menjalankan Laravel Scheduler.

Laravel menyediakan command:

php artisan schedule:run

Command tersebut akan memeriksa task yang sudah waktunya dijalankan.

Dalam production, kita biasanya membuat satu cron job yang menjalankan command tersebut setiap menit.

Contohnya:

* * * * * cd /var/www/example.com && php artisan schedule:run >> /dev/null 2>&1

Cron akan menjalankan schedule:run setiap menit.

Laravel kemudian menentukan apakah ada task yang harus dijalankan pada saat tersebut.

Alurnya menjadi:

Cron
  ↓
schedule:run
  ↓
Laravel Scheduler
  ↓
Cek jadwal
  ↓
Jalankan task

Kenapa Tidak Membuat Cron untuk Setiap Task?

Tanpa Laravel Scheduler, kita mungkin memiliki beberapa cron seperti:

0 1 * * * php artisan app:cleanup
0 8 * * * php artisan app:send-report
*/5 * * * * php artisan app:process-data

Semakin banyak task, konfigurasi cron server juga semakin sulit dikelola.

Dengan Laravel Scheduler, server cukup menjalankan:

* * * * * cd /var/www/example.com && php artisan schedule:run >> /dev/null 2>&1

Sedangkan jadwal masing-masing task didefinisikan di dalam aplikasi.

Contohnya:

Schedule::command('app:cleanup')
    ->dailyAt('01:00');

Schedule::command('app:send-report')
    ->dailyAt('08:00');

Schedule::command('app:process-data')
    ->everyFiveMinutes();

Struktur seperti ini membuat jadwal lebih mudah ditemukan dan dikelola bersama source code aplikasi.

Mengecek Scheduled Task

Laravel menyediakan command untuk melihat daftar task yang sudah dijadwalkan:

php artisan schedule:list

Command tersebut berguna untuk memastikan task sudah terdaftar dan melihat kapan task berikutnya akan dijalankan.

Menjalankan Scheduler Secara Manual

Untuk testing, kita tidak harus menunggu cron.

Jalankan:

php artisan schedule:run

Laravel akan menjalankan task yang memang sudah waktunya dijalankan.

Cara ini cukup berguna ketika sedang melakukan development atau troubleshooting scheduler.

Scheduler dan Queue

Scheduler dan Queue memiliki fungsi yang berbeda, tetapi sering digunakan bersama.

Scheduler menentukan kapan sebuah pekerjaan dijalankan, sedangkan Queue dapat digunakan untuk menjalankan pekerjaan tersebut di background.

Contohnya:

Laravel Scheduler
       ↓
Setiap hari pukul 08:00
       ↓
Dispatch Job
       ↓
Redis
       ↓
Queue Worker
       ↓
Process Job

Misalnya scheduler menjalankan:

Schedule::call(function () {
    SendDailyReport::dispatch();
})->dailyAt('08:00');

Scheduler hanya bertugas memicu job. Proses sebenarnya kemudian dapat ditangani oleh queue worker.

Jika Anda menggunakan Redis sebagai queue driver, pendekatan ini sangat cocok untuk aplikasi yang memiliki banyak proses background.

Baca juga: Laravel Queue dengan Redis: Panduan Background Job untuk Pemula

Beberapa Frekuensi yang Sering Digunakan

Laravel menyediakan berbagai metode untuk menentukan frekuensi task.

Beberapa yang umum digunakan:

->everyMinute()
->everyFiveMinutes()
->everyTenMinutes()
->hourly()
->daily()
->dailyAt('13:00')
->weekly()
->monthly()

Contoh:

Schedule::command('app:sync-data')
    ->everyTenMinutes();

Atau:

Schedule::command('app:generate-report')
    ->weekly();

Kita juga dapat memberikan batasan tertentu pada jadwal sesuai kebutuhan aplikasi.

Kesimpulan

Laravel Scheduler memudahkan kita mengatur pekerjaan otomatis tanpa harus membuat konfigurasi cron terpisah untuk setiap task.

Konsep dasarnya cukup sederhana:

Cron Server
     ↓
schedule:run
     ↓
Laravel Scheduler
     ↓
Scheduled Task

Server cukup menjalankan schedule:run setiap menit, sedangkan jadwal pekerjaan dikelola di dalam aplikasi Laravel.

Untuk aplikasi yang lebih kompleks, Scheduler juga dapat dikombinasikan dengan Laravel Queue dan Redis sehingga task terjadwal dapat diproses secara asynchronous tanpa membebani request utama aplikasi.

Dengan memahami Task Scheduling, kita sudah memiliki dasar untuk membuat aplikasi Laravel yang dapat menjalankan pekerjaan secara otomatis dan terjadwal.