Setelah episode #16 soal queue, saya sempat mengira Laravel hanya punya antrian untuk pekerjaan berat. Ternyata masih ada satu masalah klasik: pekerjaan yang harus jalan berulang setiap hari — backup database, kirim laporan pagi, bersihkan file sementara. Selama ini saya membayangkan harus menulis banyak entri cron terpisah di server, satu per tugas. Ternyata Laravel punya Task Scheduler yang membuat saya hanya perlu satu entri cron. Ini yang saya catat.

Analogi: Satu Satpam yang Dicek Tiap Menit
Di pabrik, kalau ada 50 mesin yang harus dicek, kita tidak memasang 50 alarm terpisah. Cukup satu penjaga yang berkeliling tiap menit, dia sendiri yang tahu mesin mana yang harus dijalankan sekarang. Begitu juga Laravel: di server, kita hanya menambahkan satu baris cron yang menjalankan php artisan schedule:run setiap menit. Perintah kecil ini yang berkeliling mengecek: tugas mana yang jadwalnya sudah tiba, lalu menjalankannya. Definisi “mesin mana yang perlu jalan” tidak ada di file cron — ada di dalam aplikasi Laravel sendiri.
Definisi Schedule di routes/console.php
Di Laravel modern (mulai 11, termasuk Laravel 13 yang rilis Maret 2026), seluruh jadwal didefinisikan dengan API fluent di routes/console.php. Saya tidak perlu lagi membuat method schedule() di app/Console/Kernel.php seperti di Laravel versi lama — file konfigurasi sudah semakin sedikit.
use Illuminate\Support\Facades\Schedule;
// Laporan harian jam 07:00
Schedule::command('report:send-daily')->dailyAt('07:00');
// Bersihkan file backup lama tiap hari jam 02:30
Schedule::command('backup:cleanup')->dailyAt('02:30');
// Cek database tiap jam, bisa juga pakai closure
Schedule::call(function () {
DB::statement('CHECK TABLE logs');
})->hourly();Yang menarik bagi saya: jadwal bisa dibuat dari closure biasa, tidak harus Artisan command. Tapi untuk tugas penting saya tetap memilih command — lebih mudah diuji lewat php artisan report:send-daily dan bisa dipanggil manual saat debugging.
Satu Cron Entry di Server
Setelah semua jadwal ada di routes/console.php, langkah terakhir hanya satu baris di cron server:
* * * * * cd /path-ke-proyek-laravel && php artisan schedule:run >> /dev/null 2>&1
Ini yang paling saya sukai: kalau nanti menambah tugas baru, saya tidak perlu menyentuh cron server lagi — cukup menambah satu baris di routes/console.php, deploy ulang, selesai.
Perintah yang Saya Pakai Saat Belajar
php artisan schedule:list— menampilkan semua tugas terjadwal beserta waktu eksekusi berikutnya. Ini penyelamat saat jadwal saya salah tulis.php artisan schedule:test— menjalankan satu tugas terjadwal sekarang juga tanpa menunggu waktunya tiba.php artisan schedule:work— menjalankan scheduler terus-menerus, cocok untuk development lokal tanpa pasang cron.
Best Practice yang Saya Catat
- Tugas harus tahan jalan dua kali. Jadwal bisa meleset (misal saat server sempat mati lalu mengejar), jadi script backup misalnya harus aman dijalankan berulang.
withoutOverlapping()danonOneServer(). Untuk tugas berat di aplikasi multi-server, dua method ini mencegah tugas yang sama dijalankan dua kali bersamaan.- Tugas berat pindah ke queue. Kalau tugasnya lama (generate laporan besar), jangan dijalankan langsung di scheduler — gunakan
->job()atau dispatch job seperti yang saya pelajari di episode #16, supaya scheduler tetap ringan. - Waktu ekspisit. Kalau server dan timezone bisnis tidak sama, tentukan timezone per tugas dengan method
timezone(). - Pantau kegagalan. Method seperti
emailOutputOnFailure()memberi tahu saya lewat email saat tugas terjadwal gagal — daripada mengetahui seminggu kemudian saat laporan tidak terkirim.
Inti yang saya ambil: scheduler Laravel tidak menggantikan cron server, justru memakannya menjadi satu tombol saja. Semua logika jadwal hidup di aplikasi, ter-version control bersama kode, dan bisa dideploy bersama fitur lain. Ini perubahan kecil yang terasa besar saat aplikasi mulai punya banyak tugas berulang.
Komentar Terbaru