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.
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.
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.
Kalau controller nya kalian eksekusi 2 kali, maka list antrian nya juga pasti ada 2.
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 ]); } } }
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.
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'); } }
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:
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(); ....
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
[…] Silahkan buka: Pandungan Lengkap Job Queue Laravel. […]