Gratis update & dukungan instalasi

Tutorial Website 18 Oct 2026

Cara Setting Cron Job Laravel di Shared Hosting: Tugas Otomatis Tanpa Ribet (Panduan 2026)

R Oleh renz mobellgnd
Cara Setting Cron Job Laravel di Shared Hosting: Tugas Otomatis Tanpa Ribet (Panduan 2026)

Cara Setting Cron Job Laravel di Shared Hosting: Tugas Otomatis Tanpa Ribet (Panduan 2026)

Cron job Laravel di shared hosting hanya membutuhkan satu baris perintah di cPanel yang menjalankan php artisan schedule:run setiap menit. Semua jadwal tugas — backup database harian, laporan penjualan mingguan, pengingat tagihan via WhatsApp — cukup didaftarkan di kode Laravel lewat Task Scheduler. Tanpa SSH, tanpa cron terpisah untuk setiap tugas, dan cara ini berlaku untuk Laravel 10, 11, 12, hingga 13.

Apa itu Laravel Scheduler dan kenapa cron biasa tidak cukup?

Cron di Linux pada dasarnya hanya bisa menjalankan "satu perintah pada satu jadwal". Kalau kamu punya 5 tugas rutin, pendekatan naif berarti 5 entri cron — 5 tempat yang bisa salah, 5 tempat yang harus diubah setiap kali deploy.

Laravel Task Scheduler membalik logika itu: sistem cron hanya memicu satu perintah, schedule:run, setiap menit. Perintah inilah yang mengecek daftar tugas yang kamu daftarkan di kode, lalu menjalankan yang jadwalnya sudah tiba. Hasilnya: satu-satunya hal yang diatur di cPanel adalah jadwal "tiap menit"; logika bisnisnya hidup di kode, ikut ter-versioning di Git, dan bisa diuji di lokal sebelum naik ke server.

Bagaimana cara mendaftarkan tugas terjadwal di Laravel 11/12/13?

Sejak Laravel 11, pendaftaran jadwal tidak lagi memakai app/Console/Kernel.php (file itu sudah dihapus dari struktur default), melainkan file routes/console.php dengan facade Schedule:

use Illuminate\Support\Facades\Schedule;

Schedule::command('backup:run')->daily()->at('02:00');
Schedule::command('laporan:penjualan')->weeklyOn(1, '07:00');
Schedule::command('queue:work --stop-when-empty')->everyMinute();

Kalau project-mu masih Laravel 10 atau lebih lama, logika yang sama ditulis di method schedule() pada app/Console/Kernel.php — cara kerjanya identik.

Beberapa pilihan frekuensi yang paling sering dipakai: everyMinute(), everyFiveMinutes(), hourly(), daily(), weekly(), monthly(), dailyAt('02:00'), dan cron('0 8 * * *') untuk ekspresi cron mentah.

Catatan zona waktu yang sering dilupakan: jadwal Laravel mengikuti APP_TIMEZONE di file .env, dan banyak hosting tetap memakai UTC kecuali kamu ubah. Pastikan baris ini ada:

APP_TIMEZONE=Asia/Jakarta

Atau tempelkan ->timezone('Asia/Jakarta') pada jadwal tertentu kalau sebagian tugas memakai zona waktu berbeda.

Dua pengaman yang wajib untuk tugas production: withoutOverlapping() mencegah tugas yang sama berjalan dobel saat eksekusi sebelumnya belum selesai, dan onFailure() memberi tahu kamu saat tugas gagal:

Schedule::command('backup:run')
->daily()->at('02:00')
->withoutOverlapping()
->onFailure(function () {
// kirim notifikasi ke admin, mis. via WhatsApp atau email
});

Bagaimana cara membuat perintah Artisan sendiri untuk tugasmu?

Tugas terjadwal butuh perintah Artisan yang bisa dipanggil. Buat dengan:

php artisan make:command KirimPengingatTagihan

Lalu isi method handle() dengan logika tugasmu — query invoice yang jatuh tempo 3 hari lagi, kirim notifikasi, catat ke log. Daftarkan di scheduler:

Schedule::command('pengingat:tagihan')->daily()->at('09:00');

Prinsip praktis dari pengalaman: satu command untuk satu tugas, beri nama yang menjelaskan aksinya (laporan:harian, bukan cron1), dan selalu tulis log (Log::info(...)) supaya kamu bisa menelusuri apa yang terjadi tanpa menebak-nebak.

Bagaimana cara memasang cron-nya di cPanel shared hosting?

Ini satu-satunya langkah yang dilakukan di server, dan hanya sekali:

  1. Login ke cPanel, buka menu Cron Jobs.
  2. Pada Common Settings pilih Once Per Minute ( * * * *)*.
  3. Isi kolom Command dengan:
/usr/local/bin/php /home/usernamekamu/public_html/artisan schedule:run >> /dev/null 2>&1
  1. Kosongkan kolom email notifikasi, lalu klik Add New Cron Job.

Tiga hal yang paling sering salah di langkah ini:

  1. Path PHP. /usr/local/bin/php umum di cPanel, tapi sebagian hosting memakai /usr/bin/php atau path versi spesifik seperti /opt/cpanel/ea-php83/root/usr/bin/php. Pastikan versi PHP CLI sama dengan versi PHP yang dipakai websitemu — beda versi bisa membuat scheduler gagal diam-diam. Cara cek: menu Terminal di cPanel (jika ada) lalu php -v, atau tanya CS hosting.
  2. Path artisan. Sesuaikan /home/usernamekamu/public_html dengan lokasi sebenarnya file artisan. Kalau Laravel-mu dipasang di subfolder (mis. public_html/app), path-nya mengikuti.
  3. Redirect output. >> /dev/null 2>&1 membuang output agar inbox tidak kebanjiran email cron. Namun sebagian hosting membatasi karakter > dan & pada kolom command — kalau cron tidak jalan sama sekali, coba hapus redirect-nya dulu untuk diagnosis.

Bagaimana cara memastikan scheduler benar-benar jalan?

Jangan percaya cron "sudah ditambahkan" sebelum terbukti. Urutan verifikasinya:

  1. Di lokal atau via Terminal cPanel, jalankan php artisan schedule:list — pastikan tugasmu tampil dengan jadwal yang benar.
  2. Jalankan php artisan schedule:test, pilih tugasmu, dan jawab "yes" — perintah ini mengeksekusi tugas seolah jadwalnya tiba, tanpa menunggu.
  3. Untuk simulasi real-time di lokal, php artisan schedule:work menjalankan scheduler tiap menit di foreground — berguna sebelum deploy.
  4. Di server, buat satu tugas uji ->everyMinute() yang menulis ke log (Log::info('scheduler jalan: '.now())), tunggu 2–3 menit, lalu cek storage/logs/laravel.log. Kalau baris log muncul tiap menit, scheduler-mu hidup. Hapus tugas uji setelahnya.

Apa masalah umum cron Laravel di shared hosting?

Gejala Kemungkinan penyebab Solusi
Cron terdaftar tapi log tidak pernah terisiPath PHP atau path artisan salahCek php -v di Terminal cPanel; samakan versi PHP CLI dengan versi web
Cron jalan sekali lalu berhentiHosting membatasi cron minimal 15 menitWajar di paket murah; pindahkan tugas kritis ke interval ≥ 15 menit atau naik ke VPS
Inbox penuh email tiap menitKolom email cron terisi + tanpa redirect outputKosongkan email atau pakai >> /dev/null 2>&1
Error argc/argv atau command tidak dikenaliDirektif register_argc_argv mati di PHP CLI hostingTambahkan -d register_argc_argv=On setelah path php
Tugas dobel/bertabrakanTugas lama belum selesai saat jadwal berikutnya tibaTambahkan ->withoutOverlapping()
Queue tidak terkirim-kirimTidak ada worker persisten di shared hostingJadwalkan queue:work --stop-when-empty tiap menit sebagai pengganti supervisor

Satu trik dari praktisi untuk hosting yang rewel: kalau perintah dengan redirect gagal total, ganti command menjadi skrip shell kecil yang kamu upload sendiri — sebagian panel lebih toleran pada pemanggilan file .sh daripada karakter khusus di kolom command.

Kapan cara ini tidak cocok untukmu?

Jujur saja: scheduler + cron shared hosting bukan untuk semua kebutuhan. Cara ini tidak cocok jika kamu butuh presisi di bawah satu menit, menjalankan ribuan job per menit, atau butuh worker queue yang selalu hidup (di shared hosting tidak ada Supervisor; solusinya queue:work --stop-when-empty tiap menit, yang tetap punya jeda). Untuk kebutuhan itu, VPS seperti pada panduan deploy Laravel ke VPS Ubuntu adalah langkah naik yang tepat.

Sebaliknya, untuk kebutuhan klasik pemilik source code — backup otomatis harian (lihat panduan backup otomatis Laravel), kirim email antrian lewat queue, pengingat tagihan via notifikasi WhatsApp otomatis — satu baris cron ini sudah lebih dari cukup. Kalau websitemu baru naik ke shared hosting, pastikan dulu proses deploy ke shared hosting via cPanel-nya beres dan tidak ada error 500 sebelum mengaktifkan scheduler.

FAQ

Apakah saya butuh akses SSH untuk cron Laravel di shared hosting? Tidak. Seluruh pengaturan dilakukan lewat menu Cron Jobs di cPanel. SSH hanya mempermudah diagnosis (cek php -v, baca log), bukan syarat.

Berapa entri cron yang dibutuhkan untuk 10 tugas terjadwal? Satu. Hanya schedule:run tiap menit; kesepuluh tugas didaftarkan di routes/console.php.

Apakah scheduler Laravel 10 berbeda dengan Laravel 11/12/13? Ya, di lokasi pendaftaran: Laravel 11+ memakai routes/console.php, Laravel 10 ke bawah memakai app/Console/Kernel.php. Perilaku dan perintah schedule:run-nya sama.

Kenapa cron saya jalan di lokal tapi tidak di hosting? Tiga penyebab paling umum: path PHP CLI berbeda versi, path file artisan salah, atau hosting memblokir karakter redirect >> /dev/null 2>&1. Cek satu per satu sesuai tabel troubleshooting di atas.

Apakah cron tiap menit membebani shared hosting? schedule:run yang tidak menemukan tugas jatuh tempo selesai dalam hitungan milidetik — bebannya bisa diabaikan. Yang membebani adalah tugasnya sendiri, jadi jadwalkan tugas berat (backup besar, laporan) di jam sepi seperti 02:00.

Bisakah scheduler mengirim notifikasi kalau tugas gagal? Bisa. Pakai ->onFailure() untuk logika custom atau ->emailOutputOnFailure('admin@tokomu.id') untuk email otomatis saat output tugas mengandung error.