Implementasi Laravel Queue menggunakan MongoDB
Kali ini, kita akan coba implementasi Laravel Queue dengan simple project yang akan mengirimkan email secara teratur menggunakan sistem antrian/queue worker, project ini akan connect ke database MongoDB atau MySQL.
Berikut hasil akhir dari tutorial ini berupa code github yang bisa langsung dicoba2 😄 😙
- Laravel Queue connect ke MongoDB: https://github.com/djiwandou/laravel-emailqueue/tree/mongodb-test (branch: mongodb-test)
- Laravel Queue connect ke MySQL: https://github.com/djiwandou/laravel-emailqueue (branch: master)
oiya, catatan ini dibuat dari hasil percobaan dan pengalaman pribadi penulis, berikut environment yang saya gunakan, bisa dilihat di file composer.json
"php": "^7.1.3",
"fideloper/proxy": "^4.0",
"jenssegers/mongodb": "^3.6",
"laravel/framework": "5.8.*",
"laravel/tinker": "^1.0"
Setup MongoDB di localhost
Sebelum setup Laravel Queue, kita butuh MongoDB yang aman untuk ̶d̶i̶r̶u̶s̶a̶k̶ testing. Lokasi ter-aman ya di localhost, berikut cara setup nya.
Install Homebrew (abaikan jika sdh punya)
Karena saya menggunakan mac os-x, lebih enak install Homebrew dulu, cukup copast dan jalankan script berikut di terminal
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
Tap dan install official MongoDB homebrew
Selanjutnya, kita perlu untuk memastikan versi mongodb yang akan diinstall.
$ brew tap mongodb/brew
cus lanjut install. 😄
$ brew install mongodb-community@4.2
hasil success-nya kayak gini ya
==> Summary
🍺 /usr/local/Cellar/mongodb-community/4.2.0: 21 files, 272.3MB, built in 6 seconds
Start service dan mulai Connect MongoDB
$ brew services start mongodb-community@4.2
Setelah service mongodb di-start, selanjutnya bisa menggunakan terminal dan ketik mongo
atau menggunakan mongoDB client seperti Robo 3T
Hasil di terminal setelah berhasil connect, kemudian run command berikut untuk membuat collection baru bernama canvas
db.inventory.insertOne(
{ item: "canvas", qty: 100, tags: ["cotton"], size: { h: 28, w: 35.5, uom: "cm" } }
)
Selamat, sampai sini kalian sudah berhasil setup MongoDB di localhost! yay 👍 👍
Create & configure Laravel project
Buat project Laravel baru bernama laravel-emailqueue
$ composer create-project laravel/laravel=5.8.35 laravel-emailqueue — prefer-dist
$ cd laravel-emailqueue
Konfigurasi project Laravel, ubah file .env
dengan melihat mailtrap Demo Inbox https://mailtrap.io untuk melakukan simulasi pengiriman email. (Buat akun dulu ya di mailtrap.io) 🙂
Create endpoint /email
Langkah selanjutnya, buat controller baru namanya EmailController.
$ php artisan make:controller EmailController
trus, tambahkan code berikut di routes/web.php
Route::get('email', 'EmailController@sendEmail');
lanjut buat mailable class yg bernama SendMailable (akan di-generate otomatis di app/Mail/SendMailable.php)
php artisan make:mail SendMailable
nanti isi filenya kaya gini ya
Sekarang, di file app/Http/Controller/EmailController.php add code berikut
public function sendEmail()
{
Mail::to('admin2@emailjob.com')->send(new SendMailable());
echo 'email terkirim';
}
Selanjutnya run php artisan serve
dan buka http://localhost:8000/email dan inbox mailtrap (untuk cek email masuk).
Fiuh, bernafas dulu, 😅 disini kita sudah punya database MongoDB dan endpoint /email
untuk test implementasi Laravel Queue. Masih kuat? kudu tetap s͟e͟m͟a͟n͟g͟a͟t yaa! Lanjut setup konfigurasi queue dan create job.
Setup & Konfigurasi Laravel Queue
Install driver MongoDB PHP dengan PECL (jika belum ada)
$ sudo pecl install mongodb
dan copy extension=mongodb.so
kedalam file php.ini (di macbook saya, file-nya terletak di /usr/local/etc/php/7.2/php.ini
)
Install Laravel MongoDB by Jenssegers
Run command ini didalam project Laravel kita diatas ya
$ composer require jenssegers/mongodb
next, copy script ini didalam config/app.php
Jenssegers\Mongodb\MongodbServiceProvider::class,
Konfigurasi koneksi database ke MongoDB localhost
Didalam config/database.php add code berikut didalam array connections
'mongodb' => [
'driver' => 'mongodb',
'host' => env('DB_HOST', 'localhost'),
'port' => env('DB_PORT', 27017),
'database' => env('DB_DATABASE'),
'username' => env('DB_USERNAME'),
'password' => env('DB_PASSWORD'),
],
Konfigurasi Laravel Queue agar connect ke MongoDB
Didalam config/queue.php add code berikut didalam array connections
'mongodb' => [
'driver' => 'mongodb',
'table' => 'jobs',
'queue' => 'default',
'retry_after' => 90,
],
Jangan lupa, untuk kedua konfigurasi diatas, file .env
juga harus diubah, terutama di variabel2 yang berkaitan 😄
DB_CONNECTION=mongodb
DB_HOST=127.0.0.1
DB_PORT=27017
DB_DATABASE=test_mongo_queue
DB_USERNAME=
DB_PASSWORD=
Create SendEmailJob untuk mengirimkan email
php artisan make:job SendEmailJob
Nantinya, file ini akan ter-generate secara otomatis di app/Jobs/SendEmailJob.php . Disinilah kita mendefinisikan job apa yang akan dimasukkan ke dalam antrian / queue.
isi file SendEmailJob.php seperti ini. Kalau kalian jeli, sebenarnya isinya sama kayak yg di EmailController.php sebelumnya yaitu
Mail::to('admin2@emailjob.com')->send(new SendMailable());
Artinya, kita perlu pindah juga yang di EmailController.php dari yang sebelumnya begini
public function sendEmail()
{
Mail::to('admin2@emailjob.com')->send(new SendMailable());
echo 'email terkirim';
}
jadi gini (dispatch job untuk dimasukkan ke dalam Queue — table jobs di MongoDB)
public function sendEmail()
{
dispatch(new SendEmailJob());
echo 'email3 terkirim pakai job-queue';
}
Run & Test Laravel Queue MongoDB
Final step alias langkah terakhir, kita perlu test php artisan serve
dan run http://localhost:8000/email
Hasil di browser (echo output saja)
Hasil di MongoDB (jobs akan masuk kedalam table test_mongo_queue collection jobs)
Terakhir, run script ini di terminal lain untuk memproses jobs yang masih ada di antrian php artisan queue:work
, hasilnya
[2019-09-10 07:01:19][5d774a3e0d274b35b0321ca2] Processing: App\Jobs\SendEmailJob
[2019-09-10 07:01:22][5d774a3e0d274b35b0321ca2] Processed: App\Jobs\SendEmailJob
Setelah itu buka mailtrap inbox maka akan tampil email baru di inbox (hasil eksekusi dari jobs) — jika sukses, maka jobs di MongoDB akan diclear
Sekian, semoga bermanfaat ^^
Jika ada pertanyaan atau masukan, silakan langsung kontak saya di bawah ya ✌️ ✌️
Referensi
- https://docs.mongodb.com/manual/tutorial/install-mongodb-on-os-x/
- https://appdividend.com/2017/12/21/laravel-queues-tutorial-example-scratch/
- https://code.tutsplus.com/id/tutorials/deferring-tasks-in-laravel-using-queues--cms-29957
- https://www.php.net/manual/en/mongodb.installation.pecl.php
- https://github.com/jenssegers/laravel-mongodb
Contact me
Linkedin: Djiwandou Putro
github.com/djiwandou
djiwandou (+62 822 3091 7591) | djiwandou@gmail.com