Laravel: Sıfırdan İleri Seviye

Ders 14/17 55 dakika

Queue ve Job Sistemi

Asenkron işlemler, Job oluşturma, Queue driver'ları ve worker yönetimi.

Queue ve Job Sistemi

Uzun süren işlemleri (email gönderimi, dosya işleme, API çağrıları) arka plana atarak uygulama yanıt süresini kısaltın.

Queue Konfigürasyonu

# .env
QUEUE_CONNECTION=database  # sync, database, redis, sqs
# Database driver için migration
php artisan queue:table
php artisan migrate

Job Oluşturma

php artisan make:job ProcessPodcast
php artisan make:job SendWelcomeEmail
user->email)
            ->send(new WelcomeEmail($this->user));
    }
    
    /**
     * Job başarısız olursa
     */
    public function failed(\Throwable $exception): void
    {
        // Log veya bildirim
        Log::error('Welcome email failed', [
            'user_id' => $this->user->id,
            'error' => $exception->getMessage(),
        ]);
    }
}

Job Dispatch

use App\Jobs\SendWelcomeEmail;

// Basit dispatch
SendWelcomeEmail::dispatch($user);

// Delay ile
SendWelcomeEmail::dispatch($user)->delay(now()->addMinutes(5));

// Belirli queue'ya
SendWelcomeEmail::dispatch($user)->onQueue('emails');

// Belirli connection'a
SendWelcomeEmail::dispatch($user)->onConnection('redis');

// Zincir (sıralı çalışma)
Bus::chain([
    new ProcessPodcast($podcast),
    new OptimizeAudio($podcast),
    new PublishPodcast($podcast),
])->dispatch();

// Dispatch if/unless
SendWelcomeEmail::dispatchIf($condition, $user);
SendWelcomeEmail::dispatchUnless($condition, $user);

// Sync dispatch (queue'ya atmadan direkt çalıştır)
SendWelcomeEmail::dispatchSync($user);

Queue Worker

# Worker başlat
php artisan queue:work

# Belirli queue
php artisan queue:work --queue=high,default,low

# Tek job çalıştır
php artisan queue:work --once

# Bellek limiti
php artisan queue:work --memory=512

# Timeout
php artisan queue:work --timeout=60

# Sleep (job yokken bekleme)
php artisan queue:work --sleep=3

# Failed job'ları listele
php artisan queue:failed

# Failed job'ları retry
php artisan queue:retry all
php artisan queue:retry {id}

# Failed job'ları temizle
php artisan queue:flush

Supervisor (Production)

# /etc/supervisor/conf.d/laravel-worker.conf
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/html/artisan queue:work --sleep=3 --tries=3
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=www-data
numprocs=4
redirect_stderr=true
stdout_logfile=/var/www/html/storage/logs/worker.log
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-worker:*

Önemli Noktalar

  • Queue uzun süren işleri arka plana atar
  • Job sınıfları queue'ya gönderilen iş birimleri
  • Database, Redis, SQS gibi driver'lar var
  • php artisan queue:work ile worker başlatılır
  • Failed job'lar için retry mekanizması