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
| Gejala | Kemungkinan Penyebab |
|---|---|
/horizon 404 | Route/configuration |
/horizon 403 | Authorization |
| Horizon tidak start | Config/PHP/Redis |
Supervisor FATAL | Command/path/permission/PHP |
| Worker 0 | Horizon environment/config |
| Job menumpuk | Worker/queue/Redis |
| Job failed | Error dalam Job |
| Horizon restart terus | Crash/memory/config |
| Redis connection refused | Redis service/config |
| Job masuk Queue tetapi tidak diproses | Queue name/Worker |
| Setelah deploy Worker error | Long-running process belum direstart |
| Setelah reboot Horizon mati | Supervisor/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.
