Cara Menjalankan Laravel Scheduler Menggunakan Cron Job cPanel
Apa Itu Laravel Scheduler?
Laravel Scheduler adalah fitur untuk mengatur pekerjaan otomatis langsung dari aplikasi Laravel.
Dengan fitur ini, pengembang dapat menentukan kapan sebuah perintah harus dijalankan tanpa membuat banyak konfigurasi cron secara terpisah.
Laravel Scheduler dapat digunakan untuk berbagai kebutuhan, seperti:
Mengirim email pengingat.
Memperbarui status pesanan.
Membuat laporan harian.
Menghapus data sementara.
Menjalankan backup.
Memeriksa pembayaran.
Mengirim notifikasi.
Menonaktifkan akun kedaluwarsa.
Menyinkronkan data melalui API.
Memproses pekerjaan rutin.
Laravel hanya membutuhkan satu cron job pada server. Cron tersebut menjalankan perintah schedule:run setiap menit, sedangkan jadwal setiap pekerjaan tetap dikelola dari source code aplikasi. (Laravel)
Perbedaan Laravel Scheduler dan Cron Job
Cron Job merupakan fitur pada sistem operasi atau hosting untuk menjalankan perintah pada waktu tertentu.
Laravel Scheduler merupakan pengatur jadwal yang berada di dalam aplikasi Laravel.
Alur kerjanya adalah sebagai berikut:
Cron Job cPanel berjalan setiap menit.
Cron menjalankan
php artisan schedule:run.Laravel memeriksa seluruh jadwal yang terdaftar.
Laravel hanya menjalankan tugas yang waktunya sudah sesuai.
Tugas lain akan dilewati sampai jadwal berikutnya.
Dengan cara tersebut, Anda tidak perlu membuat satu cron job untuk setiap perintah aplikasi.
Cukup buat satu cron job untuk Laravel, kemudian atur seluruh jadwal melalui source code.
Lokasi Penulisan Scheduler Laravel
Lokasi konfigurasi scheduler bergantung pada versi dan struktur Laravel yang digunakan.
Laravel 11, 12, dan 13
Pada Laravel modern, jadwal biasanya ditulis di:
routes/console.php
Contoh:
<?php
use Illuminate\Support\Facades\Schedule;
Schedule::command('report:daily')->dailyAt('08:00');
Laravel juga menyediakan opsi untuk mendefinisikan jadwal melalui withSchedule di dalam bootstrap/app.php. (Laravel)
Laravel 10 dan Versi Sebelumnya
Pada Laravel 10 dan versi sebelumnya, jadwal umumnya ditulis di:
app/Console/Kernel.php
Contoh:
<?php
namespace App\Console;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
protected function schedule(Schedule $schedule): void
{
$schedule->command('report:daily')->dailyAt('08:00');
}
}
Laravel 10 menggunakan metode schedule di dalam App\Console\Kernel untuk mendaftarkan pekerjaan terjadwal. (Laravel)
Contoh Jadwal Laravel
Berikut beberapa contoh jadwal yang sering digunakan.
Menjalankan Perintah Setiap Menit
Schedule::command('payment:check')->everyMinute();
Menjalankan Perintah Setiap Lima Menit
Schedule::command('order:update')->everyFiveMinutes();
Menjalankan Perintah Setiap Jam
Schedule::command('stock:sync')->hourly();
Menjalankan Perintah Setiap Hari
Schedule::command('report:daily')->daily();
Secara default, daily() menjalankan tugas setiap hari pada tengah malam.
Menjalankan Perintah pada Jam Tertentu
Schedule::command('report:daily')->dailyAt('08:00');
Menjalankan Perintah Setiap Hari Senin
Schedule::command('report:weekly')
->weeklyOn(1, '08:00');
Menjalankan Perintah Setiap Awal Bulan
Schedule::command('invoice:generate')
->monthlyOn(1, '07:00');
Laravel menyediakan berbagai pilihan frekuensi, mulai dari setiap menit, setiap jam, harian, mingguan, bulanan, hingga jadwal cron khusus. (Laravel)
Cara Memeriksa Jadwal yang Terdaftar
Sebelum mengatur Cron Job di cPanel, masuk ke folder utama Laravel melalui Terminal atau SSH.
Contoh:
cd /home/username/laravel-app
Kemudian jalankan:
php artisan schedule:list
Perintah tersebut akan menampilkan daftar tugas yang terjadwal beserta waktu eksekusi berikutnya.
Contoh hasil:
0 8 * * * php artisan report:daily
*/5 * * * * php artisan order:update
Jika tugas yang dibuat belum muncul, periksa kembali file:
routes/console.php
atau:
app/Console/Kernel.php
sesuai versi Laravel yang digunakan.
Menguji Scheduler Secara Manual
Sebelum memasang cron, jalankan:
php artisan schedule:run
Perintah ini akan memeriksa dan menjalankan tugas yang sedang jatuh tempo.
Apabila muncul:
No scheduled commands are ready to run.
pesan tersebut belum tentu menunjukkan error. Artinya, pada saat pengujian tidak ada jadwal yang waktunya sesuai.
Untuk pengujian, Anda dapat membuat jadwal sementara:
Schedule::call(function () {
logger('Scheduler berhasil dijalankan');
})->everyMinute();
Kemudian jalankan:
php artisan schedule:run
Periksa hasilnya melalui:
storage/logs/laravel.log
Setelah pengujian selesai, hapus jadwal sementara tersebut.
Mengetahui Lokasi Project Laravel
Cron Job membutuhkan path lengkap atau absolute path menuju file artisan.
Struktur hosting dapat terlihat seperti berikut:
/home/username/laravel-app
/home/username/public_html
Source code Laravel berada di:
/home/username/laravel-app
Sedangkan isi folder public berada di:
/home/username/public_html
Dalam kondisi tersebut, lokasi file artisan adalah:
/home/username/laravel-app/artisan
Jangan menggunakan:
/home/username/public_html/artisan
jika file artisan memang tidak berada di dalam public_html.
Untuk memastikan lokasi project, jalankan:
pwd
Pastikan Anda berada pada folder yang memiliki file berikut:
artisan
composer.json
app
bootstrap
config
routes
vendor
Mengetahui Lokasi PHP di cPanel
Selain lokasi artisan, Anda perlu mengetahui lokasi PHP yang digunakan oleh server.
Jalankan:
which php
Contoh hasil:
/usr/local/bin/php
Periksa versinya:
php -v
Pada server cPanel, binary PHP juga dapat berada di lokasi seperti:
/opt/cpanel/ea-php82/root/usr/bin/php
/opt/cpanel/ea-php83/root/usr/bin/php
/opt/cpanel/ea-php84/root/usr/bin/php
Gunakan versi PHP yang sesuai dengan aplikasi Laravel.
Sebagai contoh, jika website menggunakan PHP 8.4, perintah cron dapat menggunakan:
/opt/cpanel/ea-php84/root/usr/bin/php
Versi PHP domain dapat diperiksa melalui menu:
cPanel → MultiPHP Manager
Cara Membuat Cron Job Laravel di cPanel
Ikuti langkah berikut.
Langkah 1: Buka Menu Cron Jobs
Masuk ke cPanel, kemudian buka:
Advanced → Cron Jobs
cPanel menyediakan menu tersebut untuk membuat tugas yang berjalan berdasarkan waktu atau interval tertentu. (cPanel & WHM Documentation)
Langkah 2: Pilih Jadwal Every Minute
Pada bagian Add New Cron Job, isi jadwal berikut:
Minute: *
Hour: *
Day: *
Month: *
Weekday: *
Format tersebut berarti cron dijalankan setiap menit.
Dalam format cron lengkap, hasilnya adalah:
* * * * *
Cron tetap harus dijalankan setiap menit meskipun tugas Laravel hanya dijadwalkan sekali sehari.
Laravel akan memeriksa sendiri apakah suatu tugas sudah waktunya dijalankan.
Langkah 3: Masukkan Perintah Cron
Contoh jika PHP berada di /usr/local/bin/php:
/usr/local/bin/php /home/username/laravel-app/artisan schedule:run >> /dev/null 2>&1
Contoh jika menggunakan PHP 8.4 dari cPanel:
/opt/cpanel/ea-php84/root/usr/bin/php /home/username/laravel-app/artisan schedule:run >> /dev/null 2>&1
Ganti:
username
dengan username akun cPanel.
Ganti:
laravel-app
dengan nama folder project Laravel.
cPanel menyarankan penggunaan absolute path pada perintah cron agar file dan command dapat ditemukan dengan benar. (cPanel & WHM Documentation)
Langkah 4: Simpan Cron Job
Klik:
Add New Cron Job
Setelah tersimpan, perintah akan muncul pada bagian:
Current Cron Jobs
Alternatif Perintah Menggunakan cd
Selain langsung memanggil file artisan, cron dapat dijalankan dengan masuk ke folder project terlebih dahulu.
Contohnya:
cd /home/username/laravel-app && /usr/local/bin/php artisan schedule:run >> /dev/null 2>&1
Untuk PHP 8.4:
cd /home/username/laravel-app && /opt/cpanel/ea-php84/root/usr/bin/php artisan schedule:run >> /dev/null 2>&1
Format ini berguna apabila perintah yang dijalankan membutuhkan working directory dari project Laravel.
Fungsi /dev/null 2>&1
Pada akhir perintah terdapat bagian:
>> /dev/null 2>&1
Bagian tersebut digunakan untuk membuang output standar dan pesan error agar cPanel tidak mengirim email setiap menit.
cPanel menjelaskan bahwa penambahan /dev/null 2>&1 dapat digunakan untuk menonaktifkan notifikasi email dari satu cron job. (cPanel & WHM Documentation)
Namun, ketika masih melakukan pengujian, sebaiknya simpan output ke file log terlebih dahulu.
Contoh:
/usr/local/bin/php /home/username/laravel-app/artisan schedule:run >> /home/username/scheduler.log 2>&1
Dengan cara tersebut, hasil cron dapat diperiksa melalui:
/home/username/scheduler.log
Setelah scheduler dipastikan berjalan normal, perintah dapat dikembalikan menjadi:
/usr/local/bin/php /home/username/laravel-app/artisan schedule:run >> /dev/null 2>&1
Menyimpan Log Scheduler ke Folder Laravel
Output cron juga dapat disimpan ke folder log aplikasi:
/usr/local/bin/php /home/username/laravel-app/artisan schedule:run >> /home/username/laravel-app/storage/logs/scheduler.log 2>&1
Pastikan folder berikut dapat ditulis:
storage/logs
Contoh permission yang umum digunakan:
chmod -R 775 storage
chmod -R 775 bootstrap/cache
Pengaturan permission harus disesuaikan dengan ownership dan konfigurasi server.
Jangan langsung menggunakan permission 777 untuk seluruh folder aplikasi.
Mengatur Timezone Scheduler
Perbedaan timezone sering menyebabkan tugas berjalan pada jam yang tidak sesuai.
Untuk waktu Indonesia bagian barat, gunakan:
Asia/Jakarta
Periksa file:
config/app.php
Pada project yang mendukung environment variable, konfigurasinya dapat berupa:
'timezone' => env('APP_TIMEZONE', 'UTC'),
Kemudian tambahkan ke .env:
APP_TIMEZONE=Asia/Jakarta
Jika project tidak menggunakan APP_TIMEZONE, sesuaikan langsung pada konfigurasi:
'timezone' => 'Asia/Jakarta',
Setelah mengubah timezone, jalankan:
php artisan optimize:clear
Laravel juga memungkinkan timezone ditentukan pada tugas tertentu:
Schedule::command('report:daily')
->dailyAt('08:00')
->timezone('Asia/Jakarta');
Laravel mendukung pengaturan timezone untuk tugas terjadwal melalui metode timezone. (Laravel)
Mencegah Tugas Berjalan Bersamaan
Sebuah tugas mungkin membutuhkan waktu lebih dari satu menit untuk selesai.
Jika cron berjalan kembali sebelum proses sebelumnya selesai, tugas dapat berjalan dua kali secara bersamaan.
Gunakan:
Schedule::command('report:generate')
->everyFiveMinutes()
->withoutOverlapping();
withoutOverlapping() membantu mencegah eksekusi berikutnya dimulai ketika proses sebelumnya masih berjalan.
Contoh lain:
Schedule::command('stock:sync')
->hourly()
->withoutOverlapping(30);
Angka 30 menunjukkan waktu kedaluwarsa lock dalam satuan menit.
Pastikan cache driver aplikasi dapat digunakan karena fitur pencegahan overlap bergantung pada mekanisme lock.
Menjalankan Scheduler pada Satu Server
Jika aplikasi berjalan pada beberapa server, gunakan:
Schedule::command('report:daily')
->dailyAt('08:00')
->onOneServer();
Fitur ini mencegah tugas yang sama dijalankan oleh setiap server.
Untuk shared hosting dengan satu server aplikasi, konfigurasi tersebut biasanya tidak diperlukan.
Perbedaan Scheduler dan Queue Worker
Laravel Scheduler dan Queue Worker memiliki fungsi yang berbeda.
Scheduler menentukan kapan sebuah tugas dimulai.
Queue Worker memproses pekerjaan yang masuk ke antrean.
Sebagai contoh:
Schedule::job(new SendDailyReport)->dailyAt('08:00');
Scheduler akan memasukkan job ke antrean pada pukul 08.00.
Jika .env menggunakan:
QUEUE_CONNECTION=database
atau:
QUEUE_CONNECTION=redis
job tersebut tetap membutuhkan queue worker agar benar-benar diproses.
Scheduler yang aktif tidak otomatis berarti queue worker juga aktif.
Pada cPanel yang tidak menyediakan Supervisor, queue dapat diproses melalui cron terpisah:
/usr/local/bin/php /home/username/laravel-app/artisan queue:work --stop-when-empty >> /dev/null 2>&1
Cron tersebut dapat dijalankan setiap menit.
Namun, metode terbaik tetap bergantung pada dukungan hosting, jenis queue, dan volume pekerjaan aplikasi.
Cara Memastikan Cron Job Berjalan
Gunakan beberapa metode berikut.
Periksa Jadwal Laravel
Jalankan:
php artisan schedule:list
Pastikan tugas muncul dan jadwalnya benar.
Jalankan Scheduler Manual
php artisan schedule:run
Jika perintah manual berhasil, tetapi cron tidak berjalan, masalah kemungkinan berada pada path PHP, path project, atau konfigurasi Cron Jobs cPanel.
Simpan Output ke File Log
Gunakan sementara:
/usr/local/bin/php /home/username/laravel-app/artisan schedule:run >> /home/username/scheduler.log 2>&1
Tunggu beberapa menit, lalu periksa file log.
Tambahkan Log pada Tugas
Schedule::call(function () {
logger('Scheduler aktif: '.now());
})->everyMinute();
Periksa:
storage/logs/laravel.log
Periksa Cron Email
Pada menu Cron Jobs, tambahkan alamat email sementara pada bagian:
Cron Email
cPanel dapat mengirimkan output cron ke alamat tersebut. (cPanel & WHM Documentation)
Penyebab Laravel Scheduler Tidak Berjalan
Path PHP Salah
Contoh perintah yang gagal:
php /home/username/laravel-app/artisan schedule:run
Cron memiliki environment yang lebih terbatas dibandingkan terminal biasa. Karena itu, gunakan path PHP lengkap:
/usr/local/bin/php
atau:
/opt/cpanel/ea-php84/root/usr/bin/php
Path Artisan Salah
Pastikan file berikut benar-benar tersedia:
/home/username/laravel-app/artisan
Jangan mengarahkannya ke public_html apabila source Laravel berada di folder lain.
Versi PHP Tidak Sesuai
PHP terminal atau cron dapat berbeda dari versi PHP domain.
Periksa menggunakan:
php -v
Kemudian gunakan binary PHP yang sesuai.
Tugas Belum Terdaftar
Jalankan:
php artisan schedule:list
Jika tugas tidak muncul, periksa lokasi penulisan scheduler.
Cache Konfigurasi Lama
Jalankan:
php artisan optimize:clear
Setelah aplikasi normal pada production, buat kembali cache:
php artisan optimize
Timezone Tidak Sesuai
Periksa timezone aplikasi dan server.
Gunakan:
APP_TIMEZONE=Asia/Jakarta
jika konfigurasi project mendukungnya.
Permission Storage Bermasalah
Pastikan folder berikut dapat ditulis:
storage
bootstrap/cache
Cron Job Tidak Tersimpan
Periksa bagian:
Current Cron Jobs
Pastikan perintah sudah muncul.
Hosting Membatasi Cron Setiap Menit
Sebagian penyedia hosting dapat membatasi frekuensi cron.
Laravel secara resmi mengandalkan schedule:run setiap menit. Jika opsi setiap menit tidak tersedia, hubungi penyedia hosting untuk memastikan batas minimum yang diperbolehkan. (Laravel)
Contoh Cron Job Berdasarkan Struktur Hosting
Source Laravel di Luar public_html
Struktur:
/home/username/OVLAWEB
/home/username/public_html
Gunakan:
/opt/cpanel/ea-php84/root/usr/bin/php /home/username/OVLAWEB/artisan schedule:run >> /dev/null 2>&1
Laravel Berada di Subdomain
Struktur:
/home/username/app.domainanda.com
Gunakan:
/usr/local/bin/php /home/username/app.domainanda.com/artisan schedule:run >> /dev/null 2>&1
Pastikan lokasi tersebut merupakan root Laravel, bukan hanya folder public.
Seluruh Project Berada di public_html
Jika file artisan memang berada di:
/home/username/public_html/artisan
gunakan:
/usr/local/bin/php /home/username/public_html/artisan schedule:run >> /dev/null 2>&1
Walaupun dapat berjalan, menempatkan seluruh source Laravel di folder publik bukan struktur yang paling aman. Sebaiknya hanya folder public yang dapat diakses melalui web.
Kesalahan yang Perlu Dihindari
Membuat Cron untuk Setiap Tugas
Jangan membuat cron terpisah untuk setiap perintah jika seluruh jadwal sudah dikelola Laravel.
Cukup gunakan satu cron:
php artisan schedule:run
Menjalankan Cron Satu Kali Sehari
Cron Laravel harus dipanggil setiap menit agar Laravel dapat memeriksa jadwal secara tepat.
Menggunakan Path Relatif
Hindari:
php artisan schedule:run
tanpa lokasi project yang jelas.
Gunakan absolute path agar lebih stabil.
Langsung Membuang Semua Output
Saat pengujian, jangan langsung menggunakan /dev/null.
Simpan output ke file log agar error dapat ditemukan.
Menganggap Queue Ikut Berjalan
Scheduler dan queue worker merupakan proses berbeda.
Jika tugas mengirim job ke queue, pastikan queue worker tersedia.
Tidak Mengatur Timezone
Timezone yang salah dapat membuat laporan, notifikasi, dan proses lain berjalan pada jam yang tidak sesuai.
Membuat Tugas Berat Setiap Menit
Tugas yang membutuhkan waktu lama dapat menumpuk dan menurunkan performa server.
Gunakan jadwal yang wajar dan tambahkan withoutOverlapping() jika diperlukan.
Checklist Laravel Scheduler di cPanel
Sebelum menyelesaikan konfigurasi, pastikan:
Tugas muncul pada
php artisan schedule:list.php artisan schedule:runberhasil dijalankan manual.Lokasi file
artisansudah benar.Path PHP menggunakan lokasi lengkap.
Versi PHP sesuai dengan Laravel.
Cron menggunakan jadwal
* * * * *.Cron muncul pada Current Cron Jobs.
Timezone aplikasi sudah sesuai.
Folder
storagedapat ditulis.Cache konfigurasi sudah dibersihkan.
Output cron sudah diperiksa.
Queue worker tersedia jika diperlukan.
Tugas berat menggunakan
withoutOverlapping().Cron email atau log dinonaktifkan setelah sistem stabil.
Bantuan Laravel dari Ovla Media
Konfigurasi Laravel Scheduler merupakan salah satu bagian penting dalam menjalankan aplikasi bisnis secara otomatis.
Ovla Media menyediakan layanan pengembangan, deployment, perbaikan, dan pemeliharaan aplikasi Laravel.
Layanan yang dapat disesuaikan meliputi:
Konfigurasi Laravel Scheduler.
Pengaturan Cron Job cPanel.
Konfigurasi queue worker.
Otomatisasi laporan.
Pengingat pembayaran.
Sinkronisasi API.
Konfigurasi email dan notifikasi.
Deployment Laravel ke cPanel.
Deployment Laravel ke VPS.
Perbaikan error Laravel.
Optimasi aplikasi production.
Pengembangan aplikasi bisnis custom.
Kesimpulan
Laravel Scheduler membantu aplikasi menjalankan pekerjaan otomatis berdasarkan waktu yang telah ditentukan.
Untuk menjalankannya pada cPanel, buat satu Cron Job yang aktif setiap menit:
* * * * *
Gunakan perintah dengan absolute path:
/usr/local/bin/php /home/username/laravel-app/artisan schedule:run >> /dev/null 2>&1
Jika hosting menggunakan PHP cPanel tertentu, gunakan binary yang sesuai:
/opt/cpanel/ea-php84/root/usr/bin/php /home/username/laravel-app/artisan schedule:run >> /dev/null 2>&1
Sebelum mengaktifkan cron, periksa jadwal menggunakan:
php artisan schedule:list
Kemudian lakukan pengujian:
php artisan schedule:run
Jika cron tidak berjalan, periksa path PHP, lokasi file artisan, versi PHP, timezone, permission, cache, dan output log.
Dengan konfigurasi yang benar, Laravel Scheduler dapat menjalankan laporan, notifikasi, sinkronisasi data, dan berbagai proses otomatis tanpa harus dijalankan secara manual.
Butuh implementasi untuk kebutuhan bisnis?
OVLA Media membantu pengembangan dan optimasi aplikasi web, integrasi sistem, serta solusi Laravel sesuai kebutuhan perusahaan Anda.
Artikel Terkait
Cara Membuat Audit Log Aktivitas Pengguna di Laravel
Audit log Laravel digunakan untuk mencatat aktivitas pengguna di dalam aplikasi, seperti login, logout, membuat data, mengubah data, dan menghapus data. Dengan audit log, administrator dapat mengetahui siapa yang melakukan perubahan, kapan aktivitas terjadi, dan data apa yang terpengaruh.
Cara Membuat Sinkronisasi Stok Antar-Aplikasi Menggunakan Laravel API
Sinkronisasi stok antar-aplikasi memungkinkan jumlah persediaan tetap konsisten antara sistem seperti POS, inventory, marketplace, dan gudang. Laravel API dapat digunakan untuk mengirim perubahan stok secara otomatis sehingga setiap aplikasi memiliki informasi persediaan yang lebih akurat.
Cara Membatasi Percobaan Login Menggunakan Rate Limiting Laravel
Rate limiting pada Laravel dapat digunakan untuk membatasi jumlah percobaan login dalam periode tertentu. Fitur ini membantu mengurangi risiko brute-force dengan menolak sementara permintaan login yang terlalu banyak dari pengguna atau alamat IP yang sama.