Back to All Nuggets
Laravel php ⏱️ 2 min read
Production Implementation
Ask endoAI
<?php

declare(strict_types=1);

namespace App\Jobs;

use App\Models\Invoice;
use App\Mail\InvoiceGeneratedMail;
use Barryvdh\DomPDF\Facade\Pdf;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Storage;

class GenerateAndDispatchInvoiceJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    public int $tries = 3;
    public array $backoff = [15, 60, 180];

    public function __construct(public readonly Invoice $invoice) {
        $this->onQueue('invoices');
    }

    public function handle(): void
    {
        $pdf = Pdf::loadView('admin.invoices.pdf', [
            'invoice' => $this->invoice,
            'balance' => $this->invoice->total_amount,
            'paid' => 0,
        ]);
        $fileName = "invoices/INV-{$this->invoice->id}.pdf";
        Storage::disk('public')->put($fileName, $pdf->output());
        $this->invoice->update(['pdf_path' => $fileName, 'status' => 'dispatched']);
        if ($this->invoice->client_email) {
            Mail::to($this->invoice->client_email)->send(new InvoiceGeneratedMail($this->invoice, $pdf->output()));
        }
    }
}

Eliminating Request Timeouts with Asynchronous Job Queues

Modern web users expect sub-200ms page responses. When HTTP requests synchronously perform heavy I/O operations—such as sending SMTP emails, querying external APIs, watermarking images, or generating PDF invoices—your web server will experience high latency, thread exhaustion, and 504 Gateway Timeouts.

Core Principles of Enterprise Job Queues

  • Idempotency: A queued job might be executed more than once due to network re-tries. Structure jobs so running them twice produces identical, safe results.
  • Exponential Backoff: Use progressive retry delays (backoff = [15, 60, 180]) so rate-limited upstream services can recover.
  • Dedicated Queue Channels: Segregate high-priority notifications (SMS/STK push) onto a fast high queue while long PDF exports run on a low background queue.

Accelerate Your Engineering Career

Get monthly masterclasses, exclusive code snippets, and direct architectural reviews.

Become a Supporter • KES 500 / Month