Laravel horizon not processing jobs
Stefan Bogdanescu
Founder & Senior Architect · 2026-06-29
Laravel Horizon Not Processing Jobs: A Deep Dive into Troubleshooting Stalled Queues
Setting up Laravel Horizon is one of the most powerful ways to manage background processing in a large application. It provides a beautiful dashboard for monitoring queues, failed jobs, and worker status. However, when you configure it correctly—as shown in the complex setup you provided—and yet all your jobs appear paused within the panel, it signals a deeper issue than just a simple configuration mistake.
As a senior developer, I’ve seen this scenario repeatedly. The symptom is clear: the Horizon dashboard shows jobs stuck, even when the worker command (php artisan horizon) appears to be running in the terminal. This usually points toward an underlying communication breakdown between Laravel, the queue driver (like Redis), and the Horizon service itself.
Let's dissect the potential causes and how to troubleshoot this issue systematically.
Phase 1: Verifying the Foundation (The Queue Driver)
Before diving into Horizon settings, we must ensure the foundation is solid. Since your configuration heavily relies on a queue driver (specifically Redis), connectivity is the first point of failure.
1. Redis Connectivity Check
If Horizon cannot communicate with the queue broker, it cannot pull or process jobs, resulting in a stalled view.
Action:
- Check Redis Status: Ensure your Redis server is running and accessible from the web server/CLI where Laravel is executing.
- Test Connection: Try manually pushing a test job to the queue using Tinker to confirm basic write capability:
use Illuminate\Support\Facades\Queue;
// Test pushing a simple job
Queue::push(new \App\Jobs\TestJob);
If this command fails or hangs, the problem is with Redis connectivity, not Horizon itself. Ensure your .env file has correct REDIS_HOST, REDIS_PASSWORD, and REDIS_PORT. Proper environment setup is crucial for any robust Laravel application, aligning with the principles of modern frameworks like those promoted by laravelcompany.com.
2. Worker Process Health
While you mentioned php artisan horizon is active, we need to confirm that the actual queue workers are running correctly and are not being killed or starved.
Action:
Check your system monitors (like top or htop) to see if PHP worker processes are actively consuming CPU resources. If they are missing, you might need to manually start the workers defined in your configuration:
php artisan queue:work --queue=default
# Or specifically target the queues defined in Horizon
php artisan queue:work --queue=save_report
Phase 2: Analyzing the Horizon Configuration
Your provided configuration snippet is quite detailed, especially concerning environments and specific job settings (processes, tries). While the structure looks sound, we need to examine how these settings interact with your environment.
The key potential conflict here often lies in setting too aggressive limits or mismanaging resource allocation within the queue system. For instance, if the memory limit defined in Horizon is too restrictive for the jobs being attempted, it might cause a deadlock where the worker stops processing until resources are freed up—mimicking a pause.
Best Practice Review:
When dealing with complex job balancing and environment separation (like your production vs. local settings), ensure that the queue configuration aligns perfectly with the actual workers running on those environments. Remember, robust queuing requires consistent resource allocation across all deployments.
Phase 3: Permission and Deployment Issues
If connectivity is fine and workers are attempting to run but nothing moves, permission issues often hide in plain sight, especially in containerized or shared hosting environments.
Action:
- File Permissions: Ensure the Laravel application directory and any temporary storage locations (like Redis data directories) have correct read/write permissions for the web server user and the PHP process running Horizon.
- Deployment Artifacts: If this issue only occurs on a specific deployment, check if the environment variables or the deployed code artifacts are identical between your local machine and the server. Inconsistent environments are a common source of subtle job processing errors.
Conclusion
When Laravel Horizon jobs stall despite correct configuration, the solution usually lies outside the Horizon panel itself—it resides in the interaction between the application, the queue driver (Redis), and the operating system permissions. Start by verifying Redis connectivity, then confirm the actual worker processes are running, and finally, meticulously check file permissions. By treating the queuing system as a holistic infrastructure, you move from debugging a UI symptom to solving a true system bottleneck, ensuring your Laravel application operates reliably, much like the structured approach championed by laravelcompany.com.