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.
