Press "Enter" to skip to content

Panduan Lengkap Job Queue Laravel

fadli 1

Panduan Lengkap Job Queue Laravel.

Ketika aplikasi yang kamu buat sudah lumayan besar, ada banyak proses yang kompleks didalam nya, sehingga menyebabkan aplikasi nya mulai berjalan lambat, maka sudah saat nya kamu mencoba fitur Job Queue Laravel.

Apa Itu Job Queue Laravel?

Gampang nya sih gini.. Job queue adalah sebuah fitur pada laravel yang memungkinkan kita untuk membuat sebuah background proses.

Yang tadi nya berjalan secara synchronous, kita ubah menjadi asynchronous dengan memasukkan nya kedalam list antrian.

Maka nanti user tidak perlu lagi menunggu sampai proses tersebut selesai, karena proses nya akan dijalankan dibelakang layar.

Jenis-jenis Driver Queue

Ada beberapa jenis driver queue pada laravel, seperti redis, sync, database, beanstalkd, dan sqs.

Tapi yang akan kita gunakan kali ini adalah database. Kenapa? karena lebih mudah digunakan, lebih mudah dikonfigurasi, dan lebih mudah untuk di monitoring.

Untuk bisa menggunakan driver database, kalian perlu menjalankan migrasi nya terlebih dahulu.

Jalankan perintah:

....
php artisan queue:table
....

Kemudian dilanjut dengan menjalankan perintah:

....
php artisan migrate
....

Maka nanti akan tercipta 2 table baru, yaitu jobs dan failed_jobs.

Panduan Lengkap Job Queue Laravel

Selanjutnya, di file .env, pada variable QUEUE_CONNECTION, kalian set nilai nya menjadi database.

....
QUEUE_CONNECTION=database
....

Persiapan sudah selesai, selanjutnya kita akan membuat file job queue nya.

Membuat File Job Queue

Cara yang mimin paparkan disini bisa di implementasikan pada laravel versi berapapun yah, baik itu 5,6,7,8,9,10 atau yg lainnya.

Untuk membuat file job queue bisa dengan menjalankan perintah “php artisan make:job NamaFileJob”, contoh:

....
php artisan make:job CahayaJob
....

Maka akan tercipta sebuah file baru didalam folder “app/Jobs/CahayaJob.php”.

Didalam file tersebut terdapat sebuah method dengan nama handle() yang bisa digunakan untuk menaruh proses logic nya.

Panduan Lengkap Job Queue Laravel

Sebagai contoh disini saya memasukkan proses insert data kedalam table users.

....
public function handle()
{
    $faker = Faker::create('id_ID');

    for ($i = 1; $i <= 100; $i++) {
        User::create([
            'name' => $faker->name(),
            'email' => $faker->unique()->safeEmail(),
            'email_verified_at' => now(),
            'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
            'remember_token' => Str::random(10),
        ]);
    }
}
....

Cara Memanggil File Job Queue

Untuk memanggil file job, kita bisa menggunakan kata kunci dispatch().

Sebagai contoh, didalam file controller, pada method index saya memanggil file job queue nya:

<?php

namespace App\Http\Controllers;

use App\Jobs\CahayaJob;
use Illuminate\Http\Request;

class HomeController extends Controller
{
    public function index()
    {
        CahayaJob::dispatch();

        return view('home');
    }
}

Ketika method tersebut di eksekusi, maka logic yang kita tulis didalam file job tersebut akan masuk kedalam list antrian, kalian bisa cek pada table jobs.

Panduan Lengkap Job Queue Laravel

Kalau controller nya kalian eksekusi 2 kali, maka list antrian nya juga pasti ada 2.

Panduan Lengkap Job Queue Laravel

Membawa Parameter Kedalam File Job Queue

Nah untuk membawa parameter kedalam file Job Queue nya, kita bisa memanfaatkan method __construct().

Sebagai contoh saya membawa 2 parameter, yaitu type dan is_active.

<?php

namespace App\Jobs;

use App\Models\User;
use Faker\Factory as Faker;
use Illuminate\Support\Str;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Contracts\Queue\ShouldBeUnique;

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

    /**
     * Create a new job instance.
     *
     * @return void
     */

    public $type, $is_active;

    public function __construct($type, $is_active)
    {
        $this->type = $type;
        $this->is_active = $is_active;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        $faker = Faker::create('id_ID');

        for ($i = 1; $i <= 100; $i++) {
            User::create([
                'name' => $faker->name(),
                'email' => $faker->unique()->safeEmail(),
                'email_verified_at' => now(),
                'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
                'remember_token' => Str::random(10),
                'type' => $this->type,
                'is_active' => $this->is_active
            ]);
        }
    }
}

Panduan Lengkap Job Queue Laravel

Pertama saya membuat property nya terlebih dahulu.

....
public $type, $is_active;
....

Kemudian didalam method __construct kita isi nilai property nya:

....
public function __construct($type, $is_active)
{
    $this->type = $type;
    $this->is_active = $is_active;
}
....

Kemudian untuk menggunakan property nya, kita bisa dengan menggunakan kata kunci $this.

Panduan Lengkap Job Queue Laravel

Kemudian gimana cara memanggil file job dengan membawa parameter nya, yaitu seperti ini:

....
class HomeController extends Controller
{
    public function index()
    {
        $type = 'user';
        $is_active = 1;

        CahayaJob::dispatch($type, $is_active);

        return view('home');
    }
}

Panduan Lengkap Job Queue Laravel

Kita bisa memasukkan parameter didalam dispatch nya.

Menghandle Job Yang Gagal

Untuk menghandle job yang gagal, kamu bisa tambahkan method failed() didalam file job nya, contoh:

Panduan Lengkap Job Queue Laravel

use Throwable;
....
class CahayaJob implements ShouldQueue
{
....
public function failed(Throwable $exception): void
{
    // Send user notification of failure, etc...
}
....

Didalam method failed tersebut, kamu bisa menghandle seperti mengirim notifikasi atau aksi yang lainnya ketika job tersebut gagal di eksekusi.

Menentukan Jumlah Maksimal Job Queue Dieksekusi Ketika Gagal

Secara default, jika job queue nya gagal/error ketika dieksekusi, maka laravel akan terus mengulangi nya sampai job tersebut berhasil selesai dieksekusi.

Kalau kamu ingin membatasi nya, kamu bisa gunakan property yang bernama tries, contoh:

<?php
 
namespace App\Jobs;
 
class ProcessPodcast implements ShouldQueue
{
    /**
     * The number of times the job may be attempted.
     *
     * @var int
     */
    public $tries = 5;
}

Maka dengan perintah diatas, sistem hanya mengulangi sebanyak 5 kali saja, jika sampai 5 kali masih gagal, maka job tersebut tidak lagi di eksekusi dan akan dipindah ke failed jobs.

Set Timeout

Secara default, waktu maksimal laravel mengeksekusi job queue hanya 60 detik saja, kalau kamu punya sebuah logic yang kompleks dan membutuhkan waktu yang cukup lama, maka pada file job nya kamu perlu menambah waktu timeout nya.

Jika tidak, maka pasti job tersebut akan gagal dieksekusi dengan alasan “too long execution time..”.

Kamu bisa menentukan waktu timeout nya dengan menambahkan property timeout pada class job nya, contoh:

<?php
 
namespace App\Jobs;
 
class ProcessPodcast implements ShouldQueue
{
    /**
     * The number of seconds the job can run before timing out.
     *
     * @var int
     */
    public $timeout = 120;
}

Diatas, kita menentukan waktu timeout nya selama 120 detik / 2 menit.

Cara Menjalankan Job Queue nya

Seperti yang kita ketahui bahwasanya setiap file job di eksekusi, maka akan menambah record didalam table “jobs”.

List record didalam table “jobs” adalah list proses yang menunggu untuk dieksekusi.

Untuk mengeksekusi nya, kalian bisa jalankan perintah:

....
php artisan queue:work
....

Untuk menghentikan proses artisan nya ketika semua queue nya sudah berhasil dieksekusi, bisa menggunakan perintah berikut:

....
php artisan queue:work --stop-when-empty
....

2 perintah artisan diatas adalah cara menjalankan queue didalam local, kalo dihosting / cpanel gimana?

Cara Mengeksekusi Queue Pada Server Hosting / Cpanel

Caranya yaitu pertama kalian harus ngerti dulu tentang Task Schedule pada laravel, kemudian perlu ngerti juga cara menjalankan cron job pada cpanel nya.

Untung nya mimin sudah pernah membahas nya, silahkan dibuka : Membuat Cron Job Task Schedule Pada Laravel.

Nah kemudian didalam file “../app/Console/Kernel.php”, kalian tambahkan sebuah command console seperti berikut ini:

....
$schedule->command('queue:work --stop-when-empty')->everyMinute()->withoutOverlapping();
....

Panduan Lengkap Job Queue Laravel

Command tersebut akan dijalankan secara otomatis setiap menit nya, dan dibelakang nya kita menambahkan method chain “->withoutOverlapping()” agar tidak terjadi tumpang tindih tugas.

Kira-kira seperti itu cara membuat job queue pada laravel dan juga cara menjalankan nya, mudah kan?

Membuat Report Untuk Setiap Job Queue Yang Sedang/Sudah Dijalankan

Alangkah lebih baik jika kamu membuat report untuk menampilkan setiap status job queue yang sedang berjalan atau sudah selesai dijalankan.

Setiap data nya terdapat status waiting / processing / finish / failed.

Untuk cara pembuatan nya bisa kunjungi halaman berikut: Membuat Report Untuk Job Queue.

Support Us

Jika artikel ini bermanfaat untuk kamu, membantu menyelesaikan masalah yang sedang kamu hadapi, kamu juga bisa dukung kami dengan mengunjungi halaman berikut: https://saweria.co/sangcahayaid

Leave a Reply

Your email address will not be published. Required fields are marked *

%d bloggers like this: