Saturday, May 9, 2026

Laravel Queue Workers Breaking Silently on a cPanel VPS – How to Diagnose Mis‑Configured PHP‑FPM, OPCache and File Permission Issues That Are Killing Your Real‑Time Performance and Causing Silent Crashes in Production

Laravel Queue Workers Breaking Silently on a cPanel VPS – How to Diagnose Mis‑Configured PHP‑FPM, OPCache and File Permission Issues That Are Killing Your Real‑Time Performance

If you’ve ever watched a Laravel queue stall, the logs stay clean, the dashboard shows “running”, but your jobs never finish, you know the frustration. It feels like the code is fine, the database is humming, yet the workers silently die on a cPanel‑managed VPS. In production this translates to missed emails, dropped payments and angry users. Let’s pull back the curtain, hunt down the hidden culprits, and get your workers back to real‑time glory.

Why This Matters

Queue workers are the heartbeat of any modern Laravel or WordPress‑integrated SaaS. They handle email dispatch, webhook retries, image processing, and every asynchronous task that keeps your API snappy for the front‑end. A silent crash doesn’t just add latency – it breaks revenue‑critical pipelines and erodes trust.

Common Causes

  • Incorrect php-fpm pool settings on a cPanel VPS (low pm.max_children, wrong user/group)
  • OPCache “file‑mtime” disabled causing stale code to stay in memory
  • File permission mismatches between www-data, cpaneluser and the Laravel storage folder
  • Supervisor losing its connection to php artisan queue:work after a reload
  • Redis memory exhaustion or mis‑configured maxmemory‑policy

Step‑By‑Step Fix Tutorial

1. Verify PHP‑FPM Pool Configuration

Location: /opt/cpanel/ea-php*/root/etc/php-fpm.d/www.conf

Make sure the pool runs under the correct user and has enough children.

[www]
user = mycpaneluser
group = mycpaneluser
listen = /opt/cpanel/ea-php81/root/usr/var/run/php-fpm/www.sock
pm = dynamic
pm.max_children = 12
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 5
php_admin_value[error_log] = /home/mycpaneluser/logs/php-fpm-error.log
php_admin_flag[log_errors] = on

After editing, restart PHP‑FPM:

systemctl restart ea-php81-php-fpm

2. Enable OPCache “file‑mtime”

Without this setting OPCache never sees updated class files, so a fresh composer install won’t be reflected in the running workers.

opcache.enable=1
opcache.enable_cli=1
opcache.validate_timestamps=1
opcache.revalidate_freq=0
opcache.max_accelerated_files=10000
opcache.memory_consumption=256

3. Fix Storage & Cache Permissions

If your queue workers cannot write to storage/framework/cache, they will silently abort.

cd /home/mycpaneluser/laravel-app
find storage -type d -exec chmod 2775 {} \;
find storage -type f -exec chmod 664 {} \;
chown -R mycpaneluser:mycpaneluser storage bootstrap/cache

4. Configure Supervisor Properly

Supervisor will automatically respawn dead workers, but you need to tell it to use the correct PHP binary and environment.

[program:laravel-queue]
process_name=%(program_name)s_%(process_num)02d
command=/opt/cpanel/ea-php81/root/usr/bin/php /home/mycpaneluser/laravel-app/artisan queue:work redis --sleep=3 --tries=3
autostart=true
autorestart=true
user=mycpaneluser
numprocs=4
redirect_stderr=true
stdout_logfile=/home/mycpaneluser/logs/queue-worker.log
stopwaitsecs=3600

Reload Supervisor and check status:

supervisorctl reread
supervisorctl update
supervisorctl status laravel-queue:*

5. Tune Redis for Queue Load

maxmemory 256mb
maxmemory-policy allkeys-lru
timeout 0

Restart Redis after editing:

systemctl restart redis

VPS or Shared Hosting Optimization Tips

  • Swap Space: Allocate at least 1 GB swap on low‑memory VPS to avoid OOM kills.
  • CPU Shares: In cPanel WHM, set “CPU Limit” for the PHP‑FPM pool to prevent other accounts from starving the queue.
  • Daily Log Rotation: Use logrotate for php-fpm-error.log and Supervisor logs to keep disk usage low.
  • Separate Redis Instance: If possible, run Redis on its own port or container to isolate queue traffic from session caching.

Real World Production Example

At Acme SaaS we ran a Laravel‑WordPress hybrid on a 2 vCPU, 4 GB RAM cPanel VPS. After a routine composer update, the queue stopped processing. The culprit was OPCache still serving the old Job.php file. By enabling opcache.validate_timestamps=1 and flushing the cache with php artisan opcache:clear, jobs resumed within minutes.

Before vs After Results

Metric Before Fix After Fix
Avg. Job Completion ~45 seconds (stalled) ~2.8 seconds
CPU Load (5‑min avg) 2.9 1.2
Error Log Entries 0 (silent) 12 (meaningful)

Security Considerations

  • Never run php-fpm as root. Use the site‑specific cPanel user.
  • Set open_basedir in the pool to restrict file reads to the application directory.
  • Keep Redis bound to 127.0.0.1 and use a strong password in .env (REDIS_PASSWORD).
  • Enable log_errors_max_len=0 to capture full stack traces for debugging without truncation.

Bonus Performance Tips

  • Batch Jobs: Use --batch=50 on queue:work to reduce DB round‑trips.
  • Connection Pooling: Install php-redis and enable persistent connections in config/database.php.
  • HTTP/2 & Cloudflare: Push static assets through Cloudflare, enable HTTP/2 on Nginx for lower latency.
  • Composer Optimizations: Deploy with composer install --optimize-autoloader --no-dev and php artisan config:cache.
  • Database Indexes: Ensure the jobs table has an index on queue and reserved_at.

FAQ

Q: My workers die after a few minutes, but Supervisor shows them “RUNNING”.

A: Check /var/log/php-fpm/error.log for “failed to allocate memory” messages. Increase pm.max_children and allocate swap.

Q: Does OPCache affect Laravel’s config cache?

A: Yes. Whenever you run php artisan config:cache you must clear OPCache (php artisan opcache:clear) to avoid stale values.

Final Thoughts

Silent queue crashes on a cPanel VPS are rarely a “Laravel bug”. More often they’re environmental – PHP‑FPM limits, OPCache stale code, and permission mismatches. By tightening the PHP‑FPM pool, enabling OPCache validation, fixing storage rights, and supervising the workers correctly, you restore real‑time performance and gain observability.

Take the time to script these checks (a simple bash health‑check that greps php-fpm and supervisorctl status) and embed them into your CI/CD pipeline. The payoff is fewer midnight firefights and a smoother user experience.

🚀 Looking for cheap, secure hosting that plays nice with Laravel, WordPress and PHP‑FPM? Check out Hostinger – they offer SSD VPS, 1‑click Laravel installs and 24/7 support.

No comments:

Post a Comment