Skip to main content

Background Jobs and Queue Workers

21/28
Chapter 6 Queues, Events, and Notifications

Background Jobs and Queue Workers

24 min read Lesson 21 / 28

Asynchronous Processing with Queues

Queues defer time-consuming tasks to background workers, keeping HTTP responses fast.

Creating a Job

php artisan make:job SendWelcomeEmail
class SendWelcomeEmail implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    public int $tries = 3;
    public int $timeout = 30;

    public function __construct(public User $user) {}

    public function handle(): void
    {
        Mail::to($this->user->email)->send(new WelcomeMail($this->user));
    }

    public function failed(\Throwable $exception): void
    {
        logger()->error('Welcome email failed', [
            'user_id' => $this->user->id,
            'error' => $exception->getMessage(),
        ]);
    }
}

Dispatching Jobs

SendWelcomeEmail::dispatch($user);
SendWelcomeEmail::dispatch($user)->delay(now()->addMinutes(10));
SendWelcomeEmail::dispatch($user)->onQueue('emails');

Running Workers

php artisan queue:work --queue=emails,default --tries=3
php artisan queue:failed    # View failed jobs
php artisan queue:retry all # Retry failed jobs

Laravel Horizon (Redis)

For production with Redis queues, Horizon provides a dashboard and monitoring:

composer require laravel/horizon
php artisan horizon:install
php artisan horizon

Use Supervisor to keep Horizon running in production. Configure worker processes, memory limits, and queue priorities in config/horizon.php.