Cara Menjalankan Scheduler Laravel di Production
Scheduler Laravel di production dijalankan dengan satu cron entry yang memanggil php artisan schedule:run setiap menit. Jawaban cepatnya: definisikan jadwal di aplikasi Laravel, tambahkan cron di server, pastikan path project benar, pakai user yang punya permission, lalu cek log jika task tidak jalan.
Scheduler sering membingungkan pemula karena task berjalan otomatis di belakang layar. Di lokal kamu bisa menjalankan perintah manual, tetapi di server production Laravel butuh cron dari sistem operasi agar jadwal dievaluasi terus-menerus.
Apa Itu Scheduler Laravel?
Scheduler adalah fitur Laravel untuk menjalankan pekerjaan terjadwal, misalnya:
- mengirim email laporan setiap pagi
- membersihkan token kadaluarsa setiap malam
- membuat backup database harian
- mengecek pembayaran yang masih pending
- memproses notifikasi yang harus dikirim berkala
Tanpa scheduler, kamu biasanya harus membuat banyak cron entry manual. Dengan scheduler, jadwal ditulis di project Laravel, lalu server cukup menjalankan satu perintah setiap menit.
Alurnya seperti ini:
Tempat Menulis Jadwal
Pada Laravel versi baru, jadwal biasanya ditulis di routes/console.php:
Pada project Laravel lama, kamu mungkin masih menemukan jadwal di app/Console/Kernel.php:
Pilih lokasi yang sesuai dengan struktur project kamu. Jangan pindahkan semua file hanya karena contoh tutorial berbeda versi.
Contoh Command yang Dijadwalkan
Buat command baru:
Contoh isi command:
Jalankan manual dulu:
Kalau command manual saja error, scheduler juga akan error. Selesaikan dulu error command sebelum memasangnya ke cron.
Tambahkan Cron di Server
Masuk ke server, lalu buka crontab untuk user yang menjalankan aplikasi:
Tambahkan baris ini:
Sesuaikan /var/www/toko-laravel dengan folder project kamu. Bagian cd penting karena Laravel membaca file, .env, dan path relatif dari folder project.
Jika server punya beberapa versi PHP, gunakan path PHP yang eksplisit:
Cek lokasi PHP:
Cara Mengecek Scheduler Berjalan
Mulai dari perintah ini:
schedule:list membantu melihat task yang terdaftar. schedule:run menjalankan evaluasi jadwal saat itu juga.
Untuk memastikan cron benar-benar memanggil scheduler, sementara arahkan output ke file log:
Lalu cek:
Setelah stabil, kamu bisa mengembalikan output ke /dev/null atau tetap menyimpan log jika project membutuhkannya.
Scheduler vs Queue Worker
Scheduler dan queue worker sering tertukar.
Contoh: scheduler menjalankan command reports:send setiap pagi. Command itu bisa langsung mengirim email, atau lebih baik men-dispatch job ke queue. Queue worker lalu memproses job tersebut di belakang.
Jika task yang dijadwalkan berat, jangan semua dikerjakan langsung di scheduler. Dispatch job ke queue agar scheduler tetap ringan.
Kesalahan yang Sering Terjadi
Menjalankan schedule:work di Production
schedule:work berguna untuk development karena prosesnya berjalan terus di terminal. Untuk production VPS biasa, gunakan cron yang memanggil schedule:run setiap menit.
Path Project Salah
Cron ini akan gagal jika foldernya salah:
Pastikan path sama dengan lokasi file artisan.
PHP CLI Berbeda dari PHP-FPM
Nginx bisa memakai PHP 8.3, tetapi terminal memakai PHP 8.1. Ini bisa membuat scheduler error karena dependency tidak cocok.
Samakan versi PHP CLI dengan versi production yang kamu pakai.
User Cron Tidak Punya Permission
Jika cron berjalan sebagai user berbeda, scheduler bisa gagal menulis log, cache, atau file di storage.
Sesuaikan www-data dengan user server kamu.
Task Berat Dijalankan Setiap Menit
Jangan menjalankan query besar, export besar, atau panggilan API lambat setiap menit tanpa batasan. Gunakan queue, cache, lock, atau interval yang lebih aman.
Pencegahan
- Test command secara manual sebelum dijadwalkan.
- Jalankan
php artisan schedule:listsetelah deploy. - Gunakan path project absolut di crontab.
- Pastikan PHP CLI dan PHP-FPM memakai versi yang sama.
- Simpan log sementara saat debugging scheduler.
- Dispatch job ke queue untuk pekerjaan berat.
Bacaan Terkait
- Cara Deploy Laravel ke VPS
- Setup Supervisor untuk Queue Laravel
- Setup Nginx + PHP-FPM untuk Laravel
- Laravel
.envProduction: Checklist Aman - Laravel Migration Gagal
Referensi Resmi
FAQ
Apakah scheduler butuh Supervisor?
Tidak untuk scheduler itu sendiri. Scheduler biasanya cukup memakai cron. Supervisor dipakai untuk menjaga queue worker tetap berjalan.
Kenapa scheduler tidak jalan padahal command bisa manual?
Biasanya karena cron memakai path project salah, user berbeda, environment berbeda, atau versi PHP CLI berbeda dari yang kamu pakai saat mengetes manual.
Apakah cron harus setiap menit?
Ya, pola umum Laravel adalah satu cron setiap menit. Laravel yang menentukan task mana yang benar-benar due pada menit itu.
Apakah boleh menulis banyak cron untuk banyak command?
Bisa, tetapi tidak perlu untuk fitur scheduler Laravel. Lebih rapi tulis jadwal di Laravel dan pakai satu cron server.
Bagaimana kalau server restart?
Cron akan tetap tersedia setelah server hidup lagi selama service cron aktif. Queue worker tetap butuh process monitor seperti Supervisor.