Laravel Queue Worker ve Horizon Kurulum Rehberi (2026)

Laravel 12 & 11 kuyruk yönetimi rehberi: database vs Redis driver, artisan queue:work parametreleri, Horizon konfigürasyonu ve PaaS kalıcı process yönetimi.

Laravel Queue Worker ve Horizon Kurulum Rehberi (2026)

Modern web uygulamalarında e-posta gönderimi, PDF faturası oluşturma, harici API çağrıları veya webhook bildirimleri gibi ağır işlemleri HTTP istek-yanıt döngüsünde bekletmek kullanıcı deneyimini doğrudan bozar. Laravel Queue (Kuyruk) mimarisi ve Laravel Horizon kontrol paneli, bu asenkron işleri arka planda güvenle ölçeklemenin standart yoludur.

Laravel Kuyruk Mimarisi Nasıl Çalışır?

Bir kullanıcı sitenizden sipariş verdiğinde; ödeme işlemi tamamlandıktan sonra müşteriye fatura üretilmesi, SMS gönderilmesi ve kargo entegrasyonuna veri aktarılması gerekir. Bu adımları doğrudan Controller içinde senkron çalıştırırsanız, sayfa yanıt süresi 4-8 saniyeye kadar uzayabilir.

Kuyruk mekanizması ile iş (Job) bir veri deposuna (Redis veya Veritabanı) serileştirilerek bırakılır ve kullanıcıya anında 200 OK yanıtı dönülür. Arka planda sürekli çalışan bir Queue Worker process'i bu işi sıradan alır ve bağımsız olarak yürütür.

Kuyruk Driver Karşılaştırması: Database vs. Redis

Kriter Database Driver Redis Driver (Önerilen)
İşleme Hızı & Gecikme Orta (Disk I/O ve Tablo Kilitleme) Ultra Hızlı (<1ms In-Memory RAM)
Eşzamanlı İş Kapasitesi 10-50 worker sonrası DB yorulur 1000+ worker sorunsuz çalışır
Horizon Kontrol Paneli ❌ Desteklenmez ✅ %100 Uyumlu ve Gerekli
Ek Servis İhtiyacı Yok (Mevcut MySQL/PostgreSQL) Redis sunucusu gerektirir
Kullanım Alanı Geliştirme / Düşük trafikli siteler Production SaaS, E-Ticaret, Kurumsal API

Production İçin Kritik artisan queue:work Parametreleri

Production ortamında ham php artisan queue:work komutu çalıştırmak tehlikelidir. Hata durumlarında sonsuz döngüye girmemek veya bellek sızıntısını önlemek için şu bayraklar mutlaka kullanılmalıdır:

php artisan queue:work redis --queue=high,default --tries=3 --timeout=90 --max-time=3600 --max-jobs=1000 --memory=128 --sleep=3
  • --tries=3: Bir iş hata aldığında maksimum 3 kez tekrar denenir, ardından failed_jobs tablosuna yazılır.
  • --timeout=90: Bir iş 90 saniyeden uzun sürerse process güvenli şekilde sonlandırılır.
  • --max-time=3600 & --max-jobs=1000: PHP process'i 1 saat veya 1000 iş sonrasında kendini yeniler (Memory Leak önleme).
  • --memory=128: Worker belleği 128 MB'ı aşarsa graceful restart yapar.

Laravel Horizon Kurulumu ve Dashboard Güvenliği

Laravel Horizon, Redis kuyruklarınızı gerçek zamanlı grafiklerle izlemenizi, işleme sürelerini, throughput değerlerini ve başarısız işleri tek ekrandan yönetmenizi sağlar.

# 1. Horizon Paketini Yükleyin
composer require laravel/horizon

# 2. Asset ve Konfigürasyon Dosyalarını Yayınlayın
php artisan horizon:install

app/Providers/HorizonServiceProvider.php dosyasındaki gate() metodunu düzenleyerek yalnızca yetkili yöneticilerin /horizon paneline erişebilmesini sağlayın:

protected function gate(): void
{
    Gate::define('viewHorizon', function ($user) {
        return in_array($user->email, [
            'admin@siteniz.com',
            'dev@skyversal.com',
        ]);
    });
}

Supervisor Alternatifi: Skyversal PaaS'ta Kalıcı Process Tanımlama

Geleneksel bir Linux VPS üzerinde kuyruk çalıştırmak için Linux supervisor servisini yapılandırmak, dosya izinleri ayarlamak ve her deploy sonrası supervisorctl restart tetiklemek gerekir.

Skyversal PaaS üzerinde bu süreç tamamen otomatikleştirilmiştir. Panelinizdeki Proje Ayarları > Processes alanına girerek kuyruk komutunuzu tek satırda tanımlayabilirsiniz:

⚡ Skyversal Panel Process Yapılandırması:
Process Name: queue-worker
Command: php artisan horizon (veya php artisan queue:work redis --tries=3)

Skyversal orkestrasyonu, process'i 7/24 izler; yeni kod push edildiğinde otomatik graceful restart yapar ve çökme durumlarında sıfır kesintiyle yeniden başlatır.

Sık Karşılaşılan Kuyruk Hataları ve Çözümleri

1. "Job has been attempted too many times or run too long"

İşin çalışma süresi retry_after süresini aştığında Laravel işi tekrar kuyruğa koyar ve birden fazla worker aynı işi aynı anda çalıştırır. config/queue.php içindeki retry_after süresini (örn. 120s), worker'ın --timeout=90 değerinden her zaman daha yüksek tutun.

2. Bellek Sızıntısı (Allowed memory size exhausted)

Uzun süre çalışan PHP process'leri döngülerde belleği temizleyemeyebilir. --max-jobs=1000 ve --memory=128 parametreleri ile worker'ın periyodik olarak sıfırlanmasını sağlayın.

Son güncelleme: 26 Ağustos 2026
Bu sayfayı GitHub'da düzenle