Home Paket Belajar Bootcamp Instruktur

Tutorial Laravel Queue & Jobs #4 - Queue untuk Ekspor Data (Excel/CSV)

Belajar cara kerja Laravel Queue & Jobs dari dasar hingga implementasi nyata. Materi mencakup pembuatan job, dispatching, konfigurasi driver queue, worker, delayed jobs, batch jobs, failed jobs, retry mechanism, hingga studi kasus seperti pengiriman email, notifikasi, dan ekspor data. Cocok untuk pemula yang ingin membangun aplikasi Laravel yang lebih cepat dan scalable.

✅ Telah dilihat 22 kali

Rating: 5.00 ⭐

... 12 June 2026, 15:14

Ini salah satu use case paling sering ditemui di dunia nyata. Bayangkan admin ingin ekspor 50.000 baris data user ke CSV. Kalau diproses langsung, request bisa timeout dan memori PHP bisa jebol.

Solusinya: proses di background, simpan filenya, lalu kirim notifikasi ke user ketika file sudah siap di-download.

<?php

namespace App\Jobs;

use App\Models\User;
use App\Notifications\ExportReady;
use Illuminate\Support\Facades\Storage;

class ExportUsersJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable;

    public $timeout = 300; // max 5 menit, sesuaikan dengan kebutuhan

    public function __construct(public User $requestedBy) {}

    public function handle(): void
    {
        $path = 'exports/users-' . now()->timestamp . '.csv';
        $rows = [['Nama', 'Email', 'Terdaftar']]; // header

        // chunk() membatasi query per 500 rows — hemat memori
        User::chunk(500, function ($users) use (&$rows) {
            foreach ($users as $user) {
                $rows[] = [$user->name, $user->email, $user->created_at];
            }
        });

        // Konversi ke format CSV
        $handle = fopen('php://temp', 'r+');
        foreach ($rows as $row) {
            fputcsv($handle, $row);
        }
        rewind($handle);
        $csv = stream_get_contents($handle);
        fclose($handle);

        // Simpan ke storage
        Storage::put($path, $csv);

        // Kirim notifikasi ke user yang request
        $this->requestedBy->notify(new ExportReady($path));
    }
}

Dua hal kunci di sini. Pertama, chunk() — ini penting banget agar Laravel tidak load semua 50.000 user ke memori sekaligus, melainkan per 500 baris. Kedua, $timeout — set batas waktu maksimal agar job tidak jalan selamanya kalau ada yang salah.

Dari controller, dispatch-nya mudah:

public function export(Request $request)
{
    ExportUsersJob::dispatch(auth()->user());

    return response()->json([
        'message' => 'Ekspor sedang diproses, teman-teman akan dapat notifikasi begitu file siap.'
    ]);
}

Untuk notifikasinya, teman-teman bisa buat Notification class yang kirim email berisi link download:

<?php

namespace App\Notifications;

use Illuminate\Notifications\Notification;
use Illuminate\Notifications\Messages\MailMessage;

class ExportReady extends Notification
{
    public function __construct(public string $path) {}

    public function via($notifiable): array
    {
        return ['mail'];
    }

    public function toMail($notifiable): MailMessage
    {
        return (new MailMessage)
            ->subject('File ekspor sudah siap!')
            ->line('Data yang diminta sudah selesai diproses.')
            ->action('Download Sekarang', Storage::url($this->path));
    }
}

Pola seperti ini — dispatch job, proses di background, notif user — adalah pola yang akan teman-teman pakai berulang kali untuk berbagai fitur berat lainnya.

Daftar eBook