Belajar menggunakan fitur Queues pada Laravel

Saya tahu menggunakan queues laravel karena saya mendapati gimana caranya program php berjalan secara asynchronous atau secara gampangnya program berjalan tanpa harus menunggu proses itu selesai, Karena saya sudah pernah belajar java dan javascript dimana disana sudah terbiasa, tapi saya waktu pakai php laravel gimana ya, sempet bingung dan tanya mbah google akhirnya ada stackoverflow menyarankan menggunakan queues, dan setelah saya coba ternyata fitur queues tidak hanya menjalankankan program dibelakang saja akan tetapi bisa menyimpan pekerjaan secara di database. Jadi ketika pekerjaan gagal bisa dikerjakan lagi. Langsung permasalahan yang bisa di selesaikan queues :

Bisa apa sih queues ?

  1. Menjalankan program dibelakang layar jadi tidak menunggu prosess lain.
  2. Menegemen untuk menjalankan program secara berurutan sehingga tidak berat ketika banya program yang berjalan secara bersamaan. Atau queues akan membuat antrian pekerjaan dimana bisa di set prioritasnya. Ini agak panjang si seharusnya penjelasannya tapi saya singkat aja.
  3. Menjalankan program lagi walau sudah gagal.
  4. Menyimpan parameter sekaligus jadi walau gagal tidak harus mengirim data parameter.

Mengetahui perintah queues pada artisan

queue:failed         Daftar semua pekerjaan antrian yang gagal
queue:failed-table   Membuat migrasi untuk tabel basis data pekerjaan antrian yang gagal
queue:flush          Siram semua pekerjaan antrian yang gagal
queue:forget         Hapus pekerjaan antrian yang gagal
queue:listen         dengarkan Dengarkan antrian yang diberikan
queue:restart        restart Restart daemon pekerja antrian setelah pekerjaan mereka saat ini
queue:retry          coba lagi Coba lagi pekerjaan antrian yang gagal
queue:table          Membuat migrasi untuk tabel database jobs queue
queue:work           Mulai memproses pekerjaan pada queue sebagai daemon

Diatas saya coba dan saya kopi paste ke google translate, meniru atau mematuhi perintah dari Pak Onno.

Penerapan Fitur Queues

Pada penerapan ini menggunakan contoh kirim email, karena kalau kirim email di sarankan berjalan di belakang layar. Untuk penerapan ini harus ada perbedaan antara menggunakan queues dan tidak, saya sarankan untuk install laravel debugger karena agar ketahuan secara realnya berdasarkan data.
1. Buat kirim email tanpa queues
2. Bikin kirim email dengan queues dan bandingkan
3. Bikin error pada kirim email.
4. Bikin queues bisa kirim lagi kalau gagal
5. Pastikan queues bisa kirim lagi walau datanya berupa parameter.

Buat project laravel

  1. composer create-project –prefer-dist laravel/laravel belejar-email-queues-laravel
  2. setting .env

    QUEUE_CONNECTION=database untuk version yang udah baru gak tau versinya berapa, kalau ada yang tau boleh komen. hehe
    QUEUE_DRIVER=database untuk laravel versi lama, gak tau juga bareapa

    jangan lup koneksi dengan database
    jangan lupa seeting untuk mail smtp nya.
    Saya pakai sendinblue sebagai provider untuk kirim email, bisa pakai sendgrid atau apa yang penting bisa kirim email
  3. Install laravel debugbar
    https://github.com/barryvdh/laravel-debugbar
    1. composer require barryvdh/laravel-debugbar –dev
    2. Tambahkan di config/app.php
    Barryvdh\Debugbar\ServiceProvider::class,
    ‘Debugbar’ => Barryvdh\Debugbar\Facade::class,
    php artisan vendor:publish –provider=”Barryvdh\Debugbar\ServiceProvider”
    3. Pastikan laravel debugbar berhasil di install dengan muncul debugnya saat selesai load web. jangan gunakan respon json karena tidak akan muncul laravel debugbarnya
  4. php artisan queue:table
    php artisan migrate
  5. php artisan make:controller SendMailController
  6. php artisan make:mail SendMail --markdown=emails.queues
  7. php artisan make:job SendMailJob

Setting File

1. routes/web.php

<?php
use Illuminate\Support\Facades\Route;
Route::get('email', 'SendMailController@sendEmail');
Route::get('email-with-queues', 'SendMailController@sendEmailQueues');

2. app/Http/ Controllers/ SendMailController

 public function sendEmail()
 {
        Mail::to('rohanisuhadi@rohanisuahdi.com')
           ->send(new SendMail());
        echo "send mail";
 }

 public function sendEmailQueues()
 {
        $emailJob = (new SendMailJob());
        dispatch($emailJob);
        echo "send mail with queues";
 }

3. app/Mail/SendMail

<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Storage;

class SendMail extends Mailable
{
    use Queueable, SerializesModels;

    public function __construct()
    {

    }

    public function build()
    {
        return $this->markdown('emails.queues');
    }
}
4. app/Jobs/SendMailJob
<?php

namespace App\Jobs;

use App\Mail\SendMail;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Mail;

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

    public function __construct()
    {
        //
    }

    public function handle()
    {
        Mail::to('rohanisuhadi94@gmail.com')
            ->send(new SendMail());
    }
}

Ada dua router web satu kirim email tanpa menggunakan queues dan satu menggunakan queues maka akan ada kesimpulan.
untuk bisa melihat apakah queues berjalan bisa menggunakan perintah dibawah ini

php artisan serve

Buka lagi terminal baru dan jalankan perintah dibawah

php artisan queue:listen

Buat untuk ketika queues gagal maka bisa jalankan lagi

php artisan queue:failed-table
php artisan migrate

Kita harus bikin email tidak terkirim dengan cara membuat error. Sebagai contoh saya mengedit untuk format email menjadi seperti ini

resources/views/emails/queues.blade.php

@component('mail::message')
# Introduction

The body of your message.

@component('mail::button', ['url' => ''])
Button Text
@endcomponent

Thanks,<br>
{{ config('app.name') }}
@endcomponent

menjadi, dengan manmbahkan parameter untuk nama lengkap.
karena data tidak dikirim dari email kemungkinan akan error

@component('mail::message')
# Introduction

The body of your message.

@component('mail::button', ['url' => ''])
{{ $nama_lengkap }}
@endcomponent

Thanks,<br>
{{ config('app.name') }}
@endcomponent

pastiken restart queues dengan perintah

php artisan queue:restart
php artisan queue:work

Akan muncul seperti gambar dibawah ini ya gaes

Untuk memperbaikinya bisa dengan cara mengembalikan file resources/views/emails/queues.blade.php ini seperti semula dan restart queues dengan perintah

php artisan queue:restart
php artisan queue:work

Buka terminal satu lagi untuk perintah mengulang queues yang gagal dengan cara

php artisan queue:retry all

retry all untuk menjalankan perintah queues yang gagal semua

Bukti untuk gambar sudah melakukan penujian saya tampilkan dibawah karena saya tidak mau file image di simpan di vps saya sehingga saya harus setting s3 saya agar disimpan si s3nya.

belajar laravel queues

Untuk git bisa download disini

Leave a Reply

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