Monday, May 11, 2026

Laravel Queue Workers Stuck on Frozen Redis: 5 Dev‑Approved Fixes That Saved My Live Site Overnight

Laravel Queue Workers Stuck on Frozen Redis: 5 Dev‑Approved Fixes That Saved My Live Site Overnight

If you’ve ever stared at a php artisan queue:work that refuses to move, heart racing because your orders, emails, or notifications are piling up, you’re not alone. I’ve been there—mid‑midnight, logs spitting “Redis connection timed out,” and a production site literally grinding to a halt. After digging through the stack, I found five concrete fixes that got my queue humming again in under an hour. Below is the exact battle plan you can drop into any Laravel‑Redis setup on a VPS, shared host, or Docker swarm.

Why This Matters

Stalled queue workers are more than an annoyance; they’re a revenue killer. A frozen Redis instance can block jobs that process payments, send account‑activation emails, or update inventory. In a high‑traffic Laravel API that also feeds a WordPress front‑end, a single stuck worker can ripple into latency spikes, higher Cloudflare error rates, and a blow to your SEO rankings.

Common Causes of Frozen Redis

  • Out‑of‑memory (OOM) on the VPS causing Redis to evict keys silently.
  • Improper supervisor configuration that restarts workers too early.
  • Stale Redis connections after a PHP‑FPM reload.
  • Mis‑matched Laravel queue connection settings (e.g., default vs redis).
  • Network latency or firewall rules that block the Unix socket.
INFO: Most Laravel‑Redis freezes happen after a server update (Ubuntu 22.04 → 23.10) or a Composer install that bumps predis/predis. Always double‑check version parity.

Step‑By‑Step Fix Tutorial

1. Verify Redis Health

# Connect to redis-cli
redis-cli -h 127.0.0.1 -p 6379 ping
# Check memory usage
redis-cli info memory | grep used_memory_human
# Force a manual save to see if AOF is corrupted
redis-cli bgrewriteaof

If you get PONG and memory usage is under 75% of your instance, Redis itself is healthy.

2. Tune PHP‑FPM & Supervisor

Make sure php-fpm isn’t killing idle connections and that Supervisor restarts workers gracefully.

# /etc/php/8.2/fpm/pool.d/www.conf
pm = dynamic
pm.max_children = 30
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 10
request_terminate_timeout = 300s
# /etc/supervisor/conf.d/laravel-queue.conf
[program:laravel-queue]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/html/artisan queue:work redis --sleep=3 --tries=3 --timeout=60
autostart=true
autorestart=true
user=www-data
numprocs=4
stdout_logfile=/var/log/laravel-queue.log
stderr_logfile=/var/log/laravel-queue-error.log
stopwaitsecs=30
TIP: Set stopwaitsecs to at least 30 seconds so workers finish the current job before being killed.

3. Clear Stale Redis Connections

Laravel caches the Redis connection in the service container. After a PHP‑FPM reload, old sockets linger.

# In AppServiceProvider::boot()
use Illuminate\Support\Facades\Redis;

public function boot()
{
    if (app()->runningInConsole()) {
        Redis::disconnect();
    }
}

4. Adjust Redis tcp-keepalive and timeout

# /etc/redis/redis.conf
tcp-keepalive 60
timeout 0
save 900 1
save 300 10

Disabling the idle timeout prevents Redis from dropping connections that Laravel assumes are alive.

5. Restart the Whole Stack

sudo systemctl restart php8.2-fpm
sudo systemctl restart redis-server
sudo supervisorctl reread && sudo supervisorctl update && sudo supervisorctl restart laravel-queue:*

After these commands, watch the queue log for Processed job lines. You should see activity within seconds.

VPS or Shared Hosting Optimization Tips

  • VPS: Allocate at least 2 GB RAM for Redis on a 4 GB droplet.
  • Shared: Use predis/predis instead of phpredis when you cannot install the PHP extension.
  • Enable opcache in php.ini (opcache.enable=1, opcache.memory_consumption=256).
  • Turn on fastcgi_cache in Nginx for static WordPress assets.
  • Pin the Laravel queue worker to a CPU core with taskset if you have hyper‑threading.

Real World Production Example

My client ran a Laravel‑Vue SPA on an Ubuntu 22.04 VPS (2 vCPU, 4 GB RAM) behind Nginx, serving a WordPress blog on the same server. After a Composer update, the queue stopped processing. Applying the five fixes above restored throughput from 0 jobs/min to ≈ 180 jobs/min within 12 minutes, saving an estimated $3,200/day in lost orders.

Before vs After Results

Metric Before After
Queue latency >120 s ≈3 s
Failed jobs 57 0
CPU usage (php-fpm) 85 % 42 %
Redis memory 1.9 GB/2 GB 0.9 GB/2 GB

Security Considerations

When you expose Redis on a public IP, lock it down with a firewall (UFW or iptables) and enable requirepass. Also, rotate queue job payloads to avoid storing sensitive data in Redis.

# /etc/redis/redis.conf
requirepass My$tr0ngP@ssw0rd
bind 127.0.0.1 ::1
protected-mode yes
WARNING: Never commit .env with your Redis password to a public repo. Use Laravel’s config:cache after deployment.

Bonus Performance Tips

  1. Enable Laravel Horizon for a visual dashboard and auto‑scaling of workers.
  2. Use Redis Streams instead of simple lists for high‑throughput jobs.
  3. Set queue:retry-after to match your job timeout (e.g., 90 s).
  4. Leverage php artisan config:cache and route:cache after every deploy.
  5. Compress large payloads with gzcompress before pushing to Redis.

FAQ

Q: My queue still hangs after restarting Supervisor. What now?

A: Check the system logs for OOM kills (dmesg | grep -i kill) and increase swap space or upgrade RAM.

Q: Can I run Laravel queues on the same VPS as WordPress?

Yes, but isolate resources: assign separate php-fpm pools and limit Nginx worker connections for each site.

Q: Does Cloudflare interfere with Redis?

No, Cloudflare only caches HTTP traffic. However, make sure your API endpoint that pushes jobs isn’t rate‑limited.

Q: How do I monitor queue health?

Install Horizon or use supervisorctl status combined with redis-cli monitor for real‑time insight.

Final Thoughts

Frozen Redis queues are a silent killer for any Laravel‑backed SaaS or hybrid Laravel‑WordPress platform. By verifying Redis health, tuning PHP‑FPM and Supervisor, clearing stale connections, and applying proper timeout settings, you can bring a stalled production site back to life in minutes—not hours. Keep the checklist handy, automate the restart steps in your CI/CD pipeline, and you’ll never see a night‑time panic again.

SUCCESS: Implement these fixes and watch your queue throughput double while server load drops by half. Your clients will thank you, and your SEO rankings will recover faster.

Need Fast, Secure Hosting?

For a low‑cost VPS that includes built‑in Redis, PHP‑FPM, and 24/7 support, check out Hostinger’s cheap secure hosting. It’s a solid foundation for Laravel, WordPress, and anything in between.

No comments:

Post a Comment