Laravel Horizon Tidak Berjalan? Cara Cek dan Mengatasi Masalahnya

Apa Itu Laravel Horizon?

Laravel Horizon adalah dashboard dan konfigurasi Queue Worker untuk Laravel yang menggunakan Redis sebagai Queue backend.

Dengan Horizon, kita dapat melihat kondisi Queue secara lebih mudah, seperti:

  • Job yang sedang diproses
  • Job yang menunggu
  • Job yang selesai
  • Failed Job
  • Queue throughput
  • Runtime Job
  • Status Worker

Secara sederhana:

Laravel
   ↓
Redis
   ↓
Queue
   ↓
Horizon
   ↓
Worker
   ↓
Job

Karena Horizon bergantung pada Redis dan Worker, ketika Horizon tidak berjalan, masalahnya belum tentu berada di Horizon itu sendiri.

Bisa saja penyebabnya adalah:

Redis
 ↓
Laravel configuration
 ↓
Horizon configuration
 ↓
Worker
 ↓
Supervisor
 ↓
Permission

Gejala Laravel Horizon Tidak Berjalan

Masalah Horizon biasanya terlihat dari beberapa gejala.

Dashboard Tidak Bisa Dibuka

Misalnya ketika membuka:

/horizon

hasilnya:

404 Not Found

atau:

403 Forbidden

atau halaman tidak dapat dimuat.

Dashboard Bisa Dibuka Tetapi Tidak Ada Data

Contohnya:

Horizon
Workers: 0
Jobs: 0

padahal aplikasi sedang melakukan dispatch Job.

Job Tidak Diproses

Misalnya:

SendEmailJob::dispatch($user);

tetapi Job tetap menumpuk.

Horizon Berhenti Sendiri

Awalnya berjalan:

RUNNING

beberapa saat kemudian:

STOPPED

Horizon Menampilkan Worker tetapi Job Tidak Berjalan

Ini biasanya membutuhkan pemeriksaan Queue connection, Queue name, Redis, dan konfigurasi Supervisor.

Cara Kerja Laravel Horizon

Sebelum troubleshooting, penting memahami arsitekturnya.

                    Laravel
                       │
                       ↓
                    Redis
                       │
                       ↓
                 Horizon Master
                       │
             ┌─────────┼─────────┐
             ↓         ↓         ↓
          Worker 1  Worker 2  Worker 3
             │         │         │
             └─────────┼─────────┘
                       ↓
                     Jobs

Jika salah satu bagian bermasalah, Queue dapat ikut berhenti.

Misalnya:

Laravel → Redis → Horizon → Worker
             ↑
          Bermasalah

maka Job tidak akan diproses dengan normal.

Langkah Pertama: Pastikan Redis Berjalan

Karena Horizon menggunakan Redis, periksa Redis terlebih dahulu.

Di Ubuntu:

sudo systemctl status redis-server

Jika Redis berjalan, biasanya akan terlihat:

Active: active (running)

Jika tidak:

sudo systemctl start redis-server

Agar otomatis berjalan saat server boot:

sudo systemctl enable redis-server

Tes Koneksi Redis

Jangan hanya melihat status service.

Tes Redis secara langsung:

redis-cli ping

Jika normal:

PONG

Jika muncul error seperti:

Could not connect to Redis

berarti masalahnya berada di Redis atau koneksi ke Redis.

Periksa kembali:

Redis service
Port
Host
Password
Network

Cek Konfigurasi Redis Laravel

Buka .env:

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

Kemudian pastikan Queue menggunakan Redis:

QUEUE_CONNECTION=redis

Ini penting.

Jika ternyata:

QUEUE_CONNECTION=database

maka Job tidak akan masuk ke Redis Queue yang digunakan Horizon.

Pastikan Horizon Menggunakan Redis

Periksa:

// config/horizon.php

Konfigurasi Horizon harus sesuai dengan Queue connection yang digunakan aplikasi.

Jangan sampai:

Laravel
 ↓
Database Queue

tetapi:

Horizon
 ↓
Redis

Akibatnya Horizon tidak akan memonitor Queue yang sebenarnya digunakan aplikasi.

Bersihkan Configuration Cache

Salah satu penyebab yang sering membuat developer bingung adalah perubahan .env tidak langsung terlihat oleh Laravel.

Misalnya sebelumnya:

QUEUE_CONNECTION=database

kemudian diubah:

QUEUE_CONNECTION=redis

Tetapi Laravel masih menggunakan konfigurasi lama karena configuration cache.

Jalankan:

php artisan optimize:clear

Kemudian cek kembali.

Pada production, setelah perubahan konfigurasi, pastikan Worker/Horizon juga direstart.

Cek Konfigurasi Horizon

File utama Horizon adalah:

config/horizon.php

Di dalamnya terdapat konfigurasi seperti:

'environments' => [
    'production' => [
        'supervisor-1' => [
            'maxProcesses' => 10,
            'balanceMaxShift' => 1,
            'balanceCooldown' => 3,
        ],
    ],
],

Pastikan environment yang digunakan memang tersedia.

Misalnya server menjalankan:

APP_ENV=production

maka Horizon harus memiliki konfigurasi:

'production' => [
    // ...
],

Jika konfigurasi environment tidak sesuai, Worker Horizon dapat berjalan tidak seperti yang diharapkan.

Cek APP_ENV

Jalankan:

php artisan about --only=environment

atau periksa .env:

APP_ENV=production

Kemudian cocokkan dengan:

'environments' => [
    'production' => [
        // ...
    ],
],

Misalnya:

APP_ENV=staging

tetapi config/horizon.php hanya memiliki:

'production' => [
    // ...
],

konfigurasi Worker yang diharapkan tidak akan digunakan seperti yang Anda bayangkan.

Jalankan Horizon Secara Manual

Ini salah satu langkah troubleshooting paling penting.

Daripada langsung menyalahkan Supervisor, jalankan:

php artisan horizon

Jika Horizon berjalan:

Horizon started successfully.

atau proses tetap aktif tanpa error.

Biarkan terminal tersebut terbuka dan coba dispatch Job dari aplikasi.

Misalnya:

TestJob::dispatch();

Jika Job berjalan ketika Horizon dijalankan manual, tetapi tidak berjalan ketika menggunakan Supervisor, kemungkinan masalah berada di:

Supervisor configuration

bukan Horizon.

Gunakan horizon:status

Laravel menyediakan command untuk memeriksa status Horizon:

php artisan horizon:status

Perintah ini membantu mengetahui apakah Horizon sedang berjalan atau tidak.

Jika status menunjukkan bahwa Horizon tidak aktif, kita dapat melanjutkan pemeriksaan ke process manager seperti Supervisor.

Cek Supervisor

Pada production Ubuntu VPS, Horizon biasanya dijalankan menggunakan process manager seperti Supervisor.

Periksa:

sudo supervisorctl status

Misalnya:

laravel-horizon   RUNNING

Jika:

STOPPED

atau:

FATAL

maka Horizon tidak sedang berjalan normal.

Contoh Konfigurasi Supervisor untuk Horizon

Contoh konfigurasi:

[program:laravel-horizon]
process_name=%(program_name)s
command=php /var/www/example.com/artisan horizon
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=www-data
redirect_stderr=true
stdout_logfile=/var/www/example.com/storage/logs/horizon.log
stopwaitsecs=3600

Sesuaikan:

/var/www/example.com

dengan lokasi project Laravel Anda.

Perhatikan juga:

user
command
path project
log file

Kesalahan kecil pada path bisa membuat Supervisor gagal menjalankan Horizon.

Setelah Mengubah Supervisor

Setelah konfigurasi Supervisor diubah:

sudo supervisorctl reread

Kemudian:

sudo supervisorctl update

Lalu:

sudo supervisorctl restart laravel-horizon

Periksa:

sudo supervisorctl status

Pastikan hasilnya:

laravel-horizon   RUNNING

Cek Log Supervisor

Jika status Horizon:

FATAL

jangan menebak-nebak.

Lihat log.

Misalnya:

sudo tail -f /var/log/supervisor/supervisord.log

Atau log yang ditentukan dalam konfigurasi:

storage/logs/horizon.log

Jika menggunakan:

stdout_logfile=/var/www/example.com/storage/logs/horizon.log

periksa:

tail -f /var/www/example.com/storage/logs/horizon.log

Cek Log Laravel

Jika Horizon berjalan tetapi Job gagal, periksa:

storage/logs/laravel.log

Gunakan:

tail -f storage/logs/laravel.log

Kemudian dispatch Job.

Jika ada error seperti:

RedisException
Connection refused

berarti masalah kemungkinan berada pada Redis.

Jika:

Class not found

periksa deployment dan Composer.

Jika:

Permission denied

periksa permission.

Pastikan Package Horizon Terinstall

Periksa package:

composer show laravel/horizon

Jika package tersedia, informasi package akan ditampilkan.

Jika belum terpasang, instalasi umumnya dilakukan dengan:

composer require laravel/horizon

Gunakan versi Horizon yang kompatibel dengan versi Laravel yang digunakan.

Pastikan Horizon Sudah Dikonfigurasi

Setelah instalasi, pastikan file:

config/horizon.php

tersedia.

Pada project Laravel, konfigurasi Horizon harus berada dalam kondisi yang sesuai dengan versi Laravel/Horizon yang digunakan.

Jangan asal menyalin konfigurasi dari tutorial versi lama karena struktur konfigurasi dapat berubah antarversi.

Pastikan Redis Extension PHP Tersedia

Laravel perlu dapat berkomunikasi dengan Redis melalui client yang didukung.

Periksa extension PHP:

php -m | grep redis

Jika menggunakan PHP Redis extension dan output menunjukkan:

redis

extension tersedia.

Jika tidak ada, periksa konfigurasi PHP dan versi PHP yang digunakan CLI.

Cek Versi PHP CLI

Ini penting di server.

Jalankan:

php -v

Kemudian:

which php

Jangan sampai:

Web server
→ PHP 8.x

CLI/Supervisor
→ PHP versi berbeda

Karena Horizon biasanya dijalankan melalui PHP CLI.

Contohnya:

Browser
 ↓
Nginx
 ↓
PHP-FPM 8.3

Supervisor
 ↓
php CLI 8.2

Akibatnya aplikasi web terlihat normal, tetapi Horizon gagal berjalan.

Pastikan Supervisor Menggunakan PHP yang Benar

Cek:

which php

Jika perlu, gunakan path PHP secara eksplisit dalam Supervisor.

Misalnya:

command=/usr/bin/php /var/www/example.com/artisan horizon

Path sebenarnya tergantung instalasi server.

Untuk mengetahui path:

which php

Cek Permission Laravel

Horizon perlu dapat membaca project dan menulis log/cache tertentu.

Periksa:

ls -la

dan:

ls -la storage

Laravel biasanya membutuhkan permission write pada:

storage/
bootstrap/cache/

Contoh pada Ubuntu:

sudo chown -R www-data:www-data storage bootstrap/cache

Kemudian permission directory dapat disesuaikan dengan setup server.

Jangan memberikan permission 777 sebagai solusi permanen.

Jangan Sembarangan Menggunakan chmod 777

Ketika menemukan:

Permission denied

solusi yang sering muncul adalah:

chmod -R 777 .

Ini bukan solusi yang baik untuk production.

Lebih baik tentukan:

Siapa user yang menjalankan PHP?
Siapa user yang menjalankan Horizon?
Siapa owner project?
Directory mana yang perlu write?

Kemudian atur permission sesuai kebutuhan.

Cek User Supervisor

Ini sering terlewat.

Misalnya Supervisor:

user=www-data

tetapi project dimiliki:

deploy:deploy

Horizon mungkin tidak dapat membaca atau menulis file tertentu.

Atau sebaliknya:

user=deploy

sedangkan PHP-FPM menggunakan:

www-data

Tidak selalu salah, tetapi permission harus dirancang dengan konsisten.

Cek Queue Name

Misalnya Job dikirim ke:

SendEmailJob::dispatch($user)
    ->onQueue('emails');

Tetapi Horizon hanya menjalankan:

'queue' => ['default'],

maka Worker tidak akan mengambil Queue emails.

Hasilnya:

Redis
 ├── default
 └── emails
       ↑
       Job menunggu

sedangkan Worker:

Horizon
 ↓
default

Job di emails tetap menumpuk.

Pastikan Horizon Mendengarkan Queue yang Benar

Jika menggunakan beberapa Queue:

high
default
low

pastikan konfigurasi Supervisor Horizon sesuai kebutuhan.

Contoh:

'supervisor-1' => [
    'connection' => 'redis',
    'queue' => ['high', 'default'],
    'balance' => 'auto',
    'minProcesses' => 1,
    'maxProcesses' => 10,
],

Jika Job berada di high tetapi Worker hanya mendengarkan default, Job tidak akan diproses.

Cek Queue Connection

Pastikan:

QUEUE_CONNECTION=redis

Kemudian periksa konfigurasi:

config('queue.default')

Anda dapat menggunakan Tinker:

php artisan tinker

Lalu:

config('queue.default');

Jika hasilnya:

"redis"

maka Laravel menggunakan Redis sebagai default Queue connection.

Jika:

"database"

maka aplikasi masih menggunakan Database Queue.

Cek Redis Connection dari Laravel

Masuk Tinker:

php artisan tinker

Kemudian:

Redis::connection()->ping();

Jika berhasil, koneksi Redis dari aplikasi dapat digunakan.

Jika error:

Connection refused

periksa:

REDIS_HOST
REDIS_PORT
REDIS_PASSWORD

serta status Redis server.

Hati-Hati dengan .env yang Tidak Terbaca

Misalnya:

REDIS_HOST=127.0.0.1

tetapi aplikasi sebenarnya masih menggunakan konfigurasi lama karena cache.

Jalankan:

php artisan optimize:clear

Kemudian restart Horizon:

php artisan horizon:terminate

Jika Supervisor digunakan, Supervisor akan menjalankan Horizon kembali.

Gunakan horizon:terminate Saat Deployment

Horizon adalah long-running process.

Jika melakukan deployment:

git pull
composer install

Worker lama masih dapat menggunakan code yang sebelumnya sudah dimuat.

Gunakan:

php artisan horizon:terminate

Horizon akan berhenti setelah menyelesaikan pekerjaan yang sedang diproses dan process manager seperti Supervisor dapat menjalankan instance baru.

Alur deployment:

Deploy
 ↓
composer install
 ↓
migrate
 ↓
horizon:terminate
 ↓
Supervisor
 ↓
Horizon baru

Urutan deployment perlu disesuaikan dengan strategi deployment aplikasi agar tidak menimbulkan downtime atau masalah kompatibilitas.

Horizon Tidak Berjalan Setelah Reboot

Jika setelah VPS reboot Horizon tidak aktif, kemungkinan Supervisor belum dikonfigurasi dengan benar.

Pastikan:

autostart=true
autorestart=true

Kemudian:

sudo systemctl enable supervisor

Cek:

sudo systemctl status supervisor

Setelah reboot:

sudo supervisorctl status

Horizon seharusnya kembali RUNNING.

Dashboard /horizon Tidak Bisa Dibuka

Ini masalah yang berbeda dengan Worker.

Ada dua komponen:

Horizon Dashboard
+
Horizon Workers

Dashboard bisa gagal tetapi Worker sebenarnya berjalan.

Atau:

Dashboard berjalan
Worker mati

Keduanya harus diperiksa terpisah.

Pastikan Route Horizon Terdaftar

Secara default, Horizon menggunakan path:

/horizon

Coba:

https://domain-anda.com/horizon

Jika mendapatkan:

404

periksa konfigurasi route dan deployment Laravel.

Anda juga dapat memeriksa route:

php artisan route:list

Cari route yang berkaitan dengan Horizon.

Periksa HORIZON_PATH

Jika aplikasi menggunakan konfigurasi custom untuk path Horizon, periksa:

HORIZON_PATH=horizon

atau konfigurasi terkait di config/horizon.php.

Pastikan tidak terjadi konflik dengan route aplikasi lain.

Dashboard 403 Forbidden

Horizon dapat memiliki authorization gate untuk menentukan siapa yang boleh mengakses dashboard.

Pada production, akses dashboard sebaiknya tidak dibiarkan terbuka untuk publik tanpa proteksi.

Jika mendapatkan:

403 Forbidden

periksa konfigurasi authorization Horizon.

Biasanya terdapat konfigurasi gate yang menentukan user yang diperbolehkan membuka dashboard.

Jangan Membuka Horizon ke Publik Tanpa Proteksi

Dashboard Horizon dapat menampilkan informasi operasional aplikasi.

Karena itu, sebaiknya akses:

/horizon

dibatasi untuk administrator atau user tertentu.

Untuk production, perhatikan:

  • Authentication
  • Authorization
  • HTTPS
  • Network restriction jika diperlukan

Dashboard Kosong Padahal Job Ada

Jika /horizon dapat dibuka tetapi data kosong, cek:

QUEUE_CONNECTION
REDIS
Horizon Worker
Queue Name
Environment

Urutan debugging yang praktis:

Job di-dispatch?
      ↓
Masuk Redis?
      ↓
Horizon aktif?
      ↓
Worker aktif?
      ↓
Worker mendengarkan queue yang benar?

Pastikan Job Benar-Benar Di-dispatch

Tambahkan log:

Log::info('Dispatching test job');

TestJob::dispatch();

Kemudian:

tail -f storage/logs/laravel.log

Jika log dispatch muncul, lanjut periksa Redis.

Cek Redis Queue

Jika menggunakan Redis, Anda dapat memeriksa data Redis menggunakan tool seperti:

redis-cli

Namun hindari menghapus key Redis secara sembarangan pada production karena Redis mungkin juga digunakan untuk cache, session, lock, dan data aplikasi lainnya.

Lebih aman gunakan Horizon atau Laravel command untuk monitoring Queue jika memungkinkan.

Failed Job Bukan Berarti Horizon Mati

Misalnya Horizon menunjukkan:

Failed Jobs: 20

Ini tidak berarti Horizon tidak bekerja.

Justru bisa berarti:

Horizon
 ↓
Worker
 ↓
Job dijalankan
 ↓
Job gagal
 ↓
Failed Job

Periksa:

php artisan queue:failed

Kemudian lihat exception yang terjadi.

Horizon Running tetapi Job Selalu Failed

Jika:

Horizon: RUNNING
Worker: RUNNING

tetapi:

Failed Jobs: meningkat

maka Horizon kemungkinan baik-baik saja.

Masalahnya ada di dalam Job.

Contoh penyebab:

  • Query database gagal
  • API eksternal error
  • Permission
  • File tidak ditemukan
  • Redis error
  • Timeout
  • Memory limit
  • Bug kode

Periksa log Laravel.

Horizon Restart Terus-Menerus

Misalnya:

RUNNING
STOPPED
RUNNING
STOPPED

Periksa log Supervisor.

Kemungkinan:

PHP fatal error
Memory exhausted
Invalid configuration
Permission denied
Missing extension
Wrong PHP version

Gunakan:

sudo supervisorctl status

dan log:

sudo tail -f /var/log/supervisor/supervisord.log

Masalah Memory

Horizon dapat menjalankan beberapa Worker secara paralel.

Misalnya:

10 Worker

Jika setiap Worker menggunakan:

100 MB

secara kasar dapat membutuhkan ratusan MB hanya untuk proses Worker, belum termasuk Laravel, PHP-FPM, database, Redis, dan service lain.

Jika VPS kecil:

2 GB RAM

terlalu banyak Worker dapat menyebabkan:

RAM habis
 ↓
OOM Killer
 ↓
Worker mati
 ↓
Supervisor restart

Akibatnya Horizon terlihat seperti sering mati.

Jangan Langsung Menambah maxProcesses

Misalnya Queue lambat.

Jangan langsung mengubah:

'maxProcesses' => 100,

tanpa melihat resource server.

Lebih baik:

Monitor CPU
Monitor RAM
Monitor Queue latency
Monitor DB
Monitor API

Kemudian naikkan Worker secara bertahap.

Periksa balance Horizon

Horizon dapat menggunakan balancing untuk mengatur Worker antar Queue.

Misalnya:

'balance' => 'auto',

atau konfigurasi lain sesuai versi Horizon.

Jika menggunakan banyak Queue, pahami bagaimana balancing tersebut bekerja.

Konfigurasi yang salah dapat membuat Queue tertentu mendapatkan Worker yang tidak sesuai ekspektasi.

Cek Supervisor dan Horizon Setelah Deployment

Urutan pemeriksaan production yang praktis:

git status

Kemudian:

php artisan optimize:clear

Lalu:

composer install --no-dev --optimize-autoloader

Kemudian:

php artisan migrate --force

Jika diperlukan, restart Horizon:

php artisan horizon:terminate

Kemudian:

sudo supervisorctl status

Pastikan:

laravel-horizon   RUNNING

Perintah deployment sebenarnya harus disesuaikan dengan strategi release Anda.

Checklist Troubleshooting Laravel Horizon

Jika Horizon tidak berjalan, gunakan checklist berikut.

1. Cek Redis

sudo systemctl status redis-server

Kemudian:

redis-cli ping

Harus menghasilkan:

PONG

2. Cek .env

QUEUE_CONNECTION=redis

REDIS_HOST=127.0.0.1
REDIS_PORT=6379

Sesuaikan dengan environment Anda.

3. Clear Configuration Cache

php artisan optimize:clear

4. Cek Horizon

php artisan horizon:status

5. Jalankan Manual

php artisan horizon

Jika manual berhasil tetapi Supervisor gagal, fokus pada Supervisor.

6. Cek Supervisor

sudo supervisorctl status

7. Cek Log Supervisor

sudo tail -f /var/log/supervisor/supervisord.log

8. Cek Log Horizon

tail -f storage/logs/horizon.log

9. Cek Laravel Log

tail -f storage/logs/laravel.log

10. Cek Queue Name

Pastikan Job dan Worker menggunakan Queue yang sama.

11. Cek PHP CLI

php -v
which php

12. Cek Permission

Pastikan user Supervisor dapat menjalankan Laravel dan menulis directory yang diperlukan.

Troubleshooting Berdasarkan Gejala

GejalaKemungkinan Penyebab
/horizon 404Route/configuration
/horizon 403Authorization
Horizon tidak startConfig/PHP/Redis
Supervisor FATALCommand/path/permission/PHP
Worker 0Horizon environment/config
Job menumpukWorker/queue/Redis
Job failedError dalam Job
Horizon restart terusCrash/memory/config
Redis connection refusedRedis service/config
Job masuk Queue tetapi tidak diprosesQueue name/Worker
Setelah deploy Worker errorLong-running process belum direstart
Setelah reboot Horizon matiSupervisor/autostart

Contoh Setup Production yang Sederhana

Untuk VPS Laravel yang menggunakan Redis:

Ubuntu VPS
│
├── Nginx
│
├── PHP-FPM
│
├── Laravel
│
├── MySQL
│
├── Redis
│
└── Supervisor
      │
      └── Laravel Horizon
            │
            ├── Worker
            ├── Worker
            └── Worker

Konfigurasi .env:

APP_ENV=production

QUEUE_CONNECTION=redis

REDIS_HOST=127.0.0.1
REDIS_PORT=6379

Supervisor menjalankan:

php /var/www/example.com/artisan horizon

Sedangkan Horizon mengatur Worker berdasarkan konfigurasi:

config/horizon.php

Cara Cepat Menentukan Letak Masalah

Jika Anda sedang berada di VPS dan Horizon tidak bekerja, jangan langsung mengubah banyak konfigurasi.

Gunakan urutan:

1. Redis
   ↓
2. Laravel Redis connection
   ↓
3. Horizon status
   ↓
4. Run Horizon manually
   ↓
5. Supervisor
   ↓
6. Queue name
   ↓
7. Job

Misalnya:

redis-cli ping

berhasil.

Kemudian:

php artisan horizon

juga berhasil.

Tetapi:

sudo supervisorctl status

menunjukkan:

FATAL

Maka kita sudah mempersempit masalah:

Redis dan Horizon kemungkinan baik, tetapi process management bermasalah.

Pendekatan seperti ini jauh lebih efektif daripada mengubah .env, Redis, permission, dan Supervisor sekaligus.

Kesimpulan

Ketika Laravel Horizon tidak berjalan, jangan langsung menganggap masalahnya ada pada Horizon.

Horizon berada di tengah beberapa komponen:

Laravel
   ↓
Redis
   ↓
Horizon
   ↓
Worker
   ↓
Supervisor

Karena itu troubleshooting harus dilakukan secara berurutan.

Hal pertama yang perlu diperiksa:

redis-cli ping

kemudian:

php artisan horizon:status

lalu coba jalankan:

php artisan horizon

Jika manual berhasil, periksa:

sudo supervisorctl status

dan log Supervisor.

Jangan lupa memeriksa konfigurasi:

QUEUE_CONNECTION=redis

serta:

config/horizon.php

Pastikan environment, Queue name, PHP CLI, permission, dan Redis connection sesuai.

Untuk production, gunakan Supervisor atau process manager lain untuk menjaga Horizon tetap berjalan dan gunakan:

php artisan horizon:terminate

ketika melakukan deployment agar Worker lama dapat dihentikan dengan aman.

Pada akhirnya, troubleshooting Horizon akan jauh lebih mudah jika kita memisahkan masalah menjadi tiga bagian:

Redis bermasalah?
        ↓
Horizon/Worker bermasalah?
        ↓
Job bermasalah?

Dengan urutan tersebut, kita dapat menemukan penyebab Laravel Horizon tidak berjalan tanpa harus melakukan trial-and-error pada seluruh server.