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.