Web Development April 25, 2026 · 5 min read · 1 dilihat

Laravel Queue dan Cron Job di Production: Panduan Lengkap

Seiring aplikasi Laravel kamu berkembang, task-task berat seperti kirim email, generate laporan, atau proses data besar jadi masalah jika dijalankan secara synchronous. Queue dan Cron Job adalah solusi standar industri untuk menangani background task dengan reliable dan efisien. Artikel ini mencakup konsep dasar, implementasi praktis, setup di production, dan troubleshooting umum — semua yang kamu butuh untuk menjalankan Laravel Queue dan Scheduler dengan percaya diri di environment production.

Seiring aplikasi Laravel kamu berkembang, task-task berat seperti kirim email, generate laporan, atau proses data besar jadi masalah jika dijalankan secara synchronous. Pengguna akan menunggu lama, request timeout, dan user experience jadi buruk.

Queue dan Cron Job adalah solusi standar industri untuk menangani background task dengan reliable dan efisien. Perbedaannya sederhana: Queue cocok untuk task yang dipicu event (misal user daftar → kirim email), sementara Cron Job cocok untuk task periodik terjadwal (misal cek expired token setiap jam).

Apa Itu Laravel Queue?

Laravel Queue memungkinkan kamu untuk defer (menunda) processing task yang berat, sehingga user tidak perlu menunggu selesai. Task dimasukkan ke dalam queue, kemudian worker process mengambil dan menjalankannya di background.

Contoh use case: Saat user mendaftar, kamu bisa langsung return response "Terima kasih telah mendaftar", dan kirim email verifikasi di background via queue. User tidak perlu menunggu SMTP response.

Laravel mendukung beberapa driver queue (backend storage):

  • Sync — task langsung dijalankan (untuk development/testing)
  • Database — menyimpan job di tabel database
  • Redis — in-memory data store, sangat cepat dan recommended untuk production
  • Amazon SQS — managed queue service dari AWS
  • RabbitMQ — message broker powerful untuk high-volume tasks

Setup Laravel Queue di Production

Langkah pertama adalah memilih driver. Untuk production, Redis dan RabbitMQ adalah pilihan terbaik karena performance dan reliability-nya. Di sini kita gunakan Redis sebagai contoh.

1. Install dan Konfigurasi

Pastikan Redis sudah installed di server:

# Ubuntu/Debian
sudo apt-get install redis-server

# Atau pakai Docker
docker run -d -p 6379:6379 redis:latest

Di Laravel, set driver queue di file .env:

QUEUE_CONNECTION=redis

Dan pastikan Redis connection tersetting di config/database.php atau .env:

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

2. Create Job Class

Generate job class menggunakan artisan:

php artisan make:job SendWelcomeEmail

Ini menghasilkan file di app/Jobs/SendWelcomeEmail.php. Contoh implementasi:

<?php
namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use App\Models\User;

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

    public function __construct(public User $user)
    {
    }

    public function handle()
    {
        // Logic kirim email
        \Mail::to($this->user->email)->send(new \App\Mail\WelcomeMail($this->user));
    }
}

3. Dispatch Job

Di controller atau class manapun, dispatch job seperti ini:

use App\Jobs\SendWelcomeEmail;
use App\Models\User;

$user = User::create([...]);
SendWelcomeEmail::dispatch($user);
// atau dengan delay:
SendWelcomeEmail::dispatch($user)->delay(now()->addMinutes(5));

4. Jalankan Queue Worker

Di production, worker harus berjalan terus-menerus. Gunakan supervisor atau systemd untuk manage process:

# Quick test (jangan pakai di production)
php artisan queue:work redis

# Dengan timeout dan tries
php artisan queue:work redis --timeout=60 --tries=3

Setup Supervisor (Recommended)

Install supervisor:

sudo apt-get install supervisor

Buat config file /etc/supervisor/conf.d/laravel-queue.conf:

[program:laravel-queue]
process_name=%(program_name)s_%(process_num)02d
command=php /path/to/artisan queue:work redis --sleep=3 --tries=3 --timeout=90
autostart=true
autorestart=true
stopasgroup=true
stopwaitsecs=60
numprocs=4
redirect_stderr=true
stdout_logfile=/path/to/storage/logs/queue.log

Jalankan supervisor:

sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-queue:*

Laravel Scheduler dan Cron Job

Scheduler memungkinkan kamu schedule task berkala. Define semua task di app/Console/Kernel.php:

<?php
namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
    protected function schedule(Schedule $schedule)
    {
        // Jalankan setiap hari pukul 02:00 AM
        $schedule->command('app:send-daily-report')
            ->dailyAt('02:00');
        
        // Setiap 5 menit
        $schedule->command('app:process-pending-orders')
            ->everyFiveMinutes();
        
        // Setiap hari Senin
        $schedule->command('app:cleanup-old-logs')
            ->weekly()->mondays()->at('03:00');
        
        // Jalankan callback
        $schedule->call(function () {
            \DB::table('users')->where('status', 'inactive')->delete();
        })->monthly();
    }
}

Setup di Production

Di production, cukup add satu cron entry (di server):

* * * * * cd /path/to/project && php artisan schedule:run >> /dev/null 2>&1

Ini menjalankan Laravel scheduler setiap menit. Laravel sendiri akan cek mana task yang perlu dijalankan berdasarkan schedule definition.

Best Practices dan Error Handling

1. Implement Retry Logic

Job yang failed sebaiknya di-retry. Di job class, set property:

public $tries = 3; // Retry sampai 3 kali
public $backoff = [10, 60, 600]; // Delay: 10s, 60s, 10m

2. Monitor Failed Jobs

Job yang gagal semua retry disimpan di tabel failed_jobs:

php artisan queue:failed
php artisan queue:retry [id]
php artisan queue:forget [id]

3. Timeout dan Memory Management

Set timeout worker sesuai kebutuhan task:

php artisan queue:work --timeout=120

4. Logging dan Monitoring

Monitor queue di production menggunakan tools seperti Telescope, Pulse, atau custom logging:

protected function handle()
{
    try {
        // Task logic
        \Log::info('Job executed successfully', ['user_id' => $this->user->id]);
    } catch (\Exception $e) {
        \Log::error('Job failed', ['error' => $e->getMessage()]);
        throw $e; // Re-throw untuk retry mechanism
    }
}

5. Gunakan Queue untuk Scheduled Task

Jika scheduled task heavy, dispatch ke queue dari scheduler:

$schedule->call(function () {
    GenerateMonthlyReport::dispatch();
})->monthly();

Troubleshooting Common Issues

Job tidak dijalankan

  • Cek worker berjalan: ps aux | grep queue:work
  • Cek queue connection di .env benar
  • Lihat log di storage/logs/

Job timeout

Tingkatkan nilai --timeout atau optimize code di dalam job. Hindari sync operation berat di job handle.

Memory leak pada worker

Jalankan worker dengan --max-jobs atau --max-time untuk restart otomatis:

php artisan queue:work --max-jobs=100 --max-time=3600

Kesimpulan

Laravel Queue dan Scheduler adalah fitur krusial untuk production-ready application. Queue memisahkan task berat dari request cycle sehingga response cepat, sementara Scheduler mengelola task berkala dengan reliable. Kombinasi Redis driver, Supervisor untuk worker management, dan proper error handling akan memastikan background task kamu berjalan smooth dan scalable.

Investasi waktu di awal untuk setup benar akan menghemat headache dan downtime di kemudian hari. Mulai dengan Redis queue sederhana, monitor dengan logging, dan scale ke RabbitMQ jika volume job terus bertambah.

Tags:

#Laravel #Queue #Scheduler #Background Job #Production

Share this article: