Tutorial Laravel #27: Queue dan Job di Laravel
1. Apa itu Queue?
Queue (antrian) digunakan untuk menjalankan proses berat di background tanpa membuat user menunggu. Contoh: kirim email, generate thumbnail, proses pembayaran, export laporan, kirim notifikasi ke banyak user. Semua ini bisa dimasukkan ke queue dan diproses secara asinkron.
2. Setup Queue
# Konfigurasi di .env
QUEUE_CONNECTION=database # pakai database sebagai driver
# Buat tabel jobs di database
php artisan queue:table
php artisan migrate
Driver queue yang tersedia: sync (langsung, untuk dev), database, redis, sqs, beanstalkd.
3. Membuat Job
php artisan make:job SendEmailJob
php artisan make:job ProcessImageJob
php artisan make:job GenerateLaporanJob
<?php
// app/Jobs/SendEmailJob.php
namespace AppJobs;
use AppModelsUser;
use AppMailWelcomeMail;
use IlluminateBusQueueable;
use IlluminateContractsQueueShouldQueue;
use IlluminateFoundationBusDispatchable;
use IlluminateQueueInteractsWithQueue;
use IlluminateQueueSerializesModels;
use IlluminateSupportFacadesMail;
class SendEmailJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
// Jumlah percobaan jika job gagal
public int $tries = 3;
// Timeout dalam detik
public int $timeout = 60;
public function __construct(public User $user) {}
// Logika utama job
public function handle(): void
{
Mail::to($this->user->email)->send(new WelcomeMail($this->user));
}
// Dijalankan jika job gagal setelah semua percobaan
public function failed(Throwable $exception): void
{
Log::error("Gagal kirim email ke {$this->user->email}: " . $exception->getMessage());
}
}
4. Dispatch Job ke Queue
use AppJobsSendEmailJob;
// Dispatch segera ke queue
SendEmailJob::dispatch($user);
// Dispatch dengan delay (kirim setelah 5 menit)
SendEmailJob::dispatch($user)->delay(now()->addMinutes(5));
// Dispatch ke queue spesifik
SendEmailJob::dispatch($user)->onQueue('emails');
// Dispatch hanya jika kondisi terpenuhi
SendEmailJob::dispatchIf($user->email_verified, $user);
// Dispatch sync (langsung, tidak masuk queue) - berguna untuk testing
SendEmailJob::dispatchSync($user);
5. Menjalankan Queue Worker
# Jalankan queue worker
php artisan queue:work
# Dengan konfigurasi lebih lengkap
php artisan queue:work --queue=default,emails --tries=3 --timeout=60
# Process satu job lalu berhenti (cocok untuk CRON)
php artisan queue:work --once
# Di production, pakai Supervisor agar worker tetap berjalan
# queue:listen untuk development (auto-reload saat kode berubah)
php artisan queue:listen
6. Batch Jobs
use AppJobsProcessImageJob;
use IlluminateBusBatch;
use IlluminateSupportFacadesBus;
$batch = Bus::batch([
new ProcessImageJob($gambar1),
new ProcessImageJob($gambar2),
new ProcessImageJob($gambar3),
])->then(function (Batch $batch) {
// Semua job selesai
Log::info("Semua gambar berhasil diproses!");
})->catch(function (Batch $batch, Throwable $e) {
// Ada job yang gagal
Log::error("Ada gambar yang gagal diproses.");
})->dispatch();
echo "Batch ID: " . $batch->id;
7. Monitor Queue
# Lihat job yang gagal
php artisan queue:failed
# Jalankan ulang job yang gagal
php artisan queue:retry all
php artisan queue:retry 5 # retry job dengan ID 5
# Hapus semua job yang gagal
php artisan queue:flush
8. Ringkasan
- Queue menjalankan proses berat di background tanpa mengganggu user
- Buat job dengan
php artisan make:job NamaJobdan implementasikanShouldQueue - Dispatch ke queue dengan
NamaJob::dispatch() - Jalankan worker dengan
php artisan queue:work - Di production, gunakan Supervisor untuk memastikan worker selalu berjalan
Tutorial berikutnya membahas API Resource dan REST API dasar di Laravel.
.jpg)
