Laravel Memiliki Package first party untuk memonitoring job queue
atau background job yang bisa dijadwalkan atau delaying. Package itu disebut Horizon
gratis dan sangat bagus dalam visualisasi. Jika anda sebelumnya adalah Rails Developer
anda pastinya sudah faham dengan hal ini karena di Ruby on Rails itu ada yang namanya Sidekiq. Horizon hanyalah package yang hanya bisa memonitoring Queue
dari laravel, sedangkan yang melakukan job action proccessing nya biasanya menggunakan Redis
.
Selain Redis anda juga bisa menggunakan AWS sqs dari amazon, namun jika aplikasi anda masih terhitung kecil dan tidak terlalu komplex, Redis masih sangat berfungsi dengan baik.
Baiklah sekarang kita akan mengimplementasikan menggunakan Horizon dan Redis di Server Aplikasi Laravel anda.
Untuk menginstall redis anda harus mengerti beberapa cara untuk menggunakan sudo
untuk pengguna ubuntu.
Update terlebih dahulu semua package dari server anda.
sudo apt update
Lalu instal Redis dengan mengetik:
sudo apt install redis-server
Ini akan mengunduh dan menginstal Redis serta dependensinya. Setelah ini, ada satu perubahan konfigurasi penting yang harus dibuat di dalam berkas konfigurasi Redis, yang dihasilkan secara otomatis selama instalasi.
Edit konfigurasi Redis dengan nano
dengan cara mengetik :
sudo nano /etc/redis/redis.conf
Edit bagian supervised
menggunakan systemd
yang ada di file /etc/redis/redis.conf
# If you run Redis from upstart or systemd, Redis can interact with your # supervision tree. Options: # supervised no - no supervision interaction # supervised upstart - signal upstart by putting Redis into SIGSTOP mode # supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET # supervised auto - detect upstart or systemd method based on # UPSTART_JOB or NOTIFY_SOCKET environment variables # Note: these supervision methods only signal "process is ready." # They do not enable continuous liveness pings back to your supervisor. supervised systemd
Restart Redis anda dengan memasukan perintah :
sudo systemctl restart redis.service
Baik sekarang kita kembali ke Aplikasi Laravel anda dan menginstall package horizon
dari laravel
composer require laravel/horizon
Setelah menginstall package sekarang kita install horizon
nya
php artisan horizon:install
Dan akan menghasilkan file config/horizon.php
sekarang kita konfigurasikan horizon.php
dan sesuaikan dengan kebutuhan anda. Untuk membedakan antara development dan production.
'environments' => [ 'production' => [ 'supervisor-1' => [ 'maxProcesses' => 10, 'balanceMaxShift' => 1, 'balanceCooldown' => 3, ], ], 'local' => [ 'supervisor-1' => [ 'maxProcesses' => 3, ], ], ],
Di pengaturan Default
kita akan menggunakan redis sebagai defaultnya
:
'defaults' => [ 'supervisor-1' => [ 'connection' => 'redis', 'queue' => ['default'], 'balance' => 'auto', 'maxProcesses' => 1, 'memory' => 128, 'tries' => 1, 'nice' => 0, ], ],
Anda juga harus mengkonfigurasikan untuk permission
akses hanya user tertentu dan itu bisa anda setup difile app/Providers/HorizonServiceProvider.php
menjadi seperti ini :
/** * Register the Horizon gate. * * This gate determines who can access Horizon in non-local environments. * * @return void */ protected function gate() { Gate::define('viewHorizon', function ($user) { return in_array($user->email, [ 'anda@aplikasi.com', ]); }); }
Publish semua package dari horizon
dengan memasukan perintah :
php artisan horizon:publish
Dan script di file composer.json
agar otomatis publish horizon ketika melakukan composer reload :
{ "scripts": { "post-update-cmd": ["@php artisan horizon:publish --ansi"] } }
Jika anda masih tahap development anda bisa menjalankan perintah :
# Untuk Menjalankan Horizon php artisan horizon # Untuk Melakukan Pause php artisan horizon:pause # Untuk Melakukan Melanjutkan php artisan horizon:continue
Sedangkan untuk di Production nanti menggunakan supervisord
Install Supervisor di Server
sudo apt-get install supervisor
Lalu anda harus membuat file di folder /etc/supervisor/conf.d
dengan nama contohnya horizon.conf
sample nya seperti ini :
[program:horizon] process_name=%(program_name)s # Sesuaikan dengan Direktori Aplikasi anda command=php /home/forge/example.com/artisan horizon autostart=true autorestart=true # Sesuaikan dengan User Aplikasi anda user=forge redirect_stderr=true # Sesuaikan dengan Direktori Aplikasi anda stdout_logfile=/home/forge/example.com/horizon.log stopwaitsecs=3600
Masukan beberapa perintah untuk menjalankan supervisord
# Perintah untuk Membaca Kembali sudo supervisorctl reread # Perintah untuk Mengupdate sudo supervisorctl update # Perintah untuk Memulai Horizon dengan menggunakan `supervisor` sudo supervisorctl start horizon
Sekarang saatnya kita coba untuk menggunakannya Go Run gaesss...
php artisan make:job UploadDataProcessJob
Dan akan membuat file di App/Jobs/UploadDataProcessJob
lalu sekarang kita edit :
<?php namespace App\Jobs; use App\Models\User; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldBeUnique; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; use Illuminate\Support\Facades\Notification; class CandidateProccessJob implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; // Parameter yang diterima dari Controller protected $user; public function __construct(User $user) { $this->user = $user; } public function handle() { $user = $this->user; // Contoh jika Job Processingnya mengirimkan Email ke User Notification::send($user, new SendEmailToUser($user)); }
Untuk Lebih lengkap Membuat Notification anda bisa membaca artikel tentang Membuat Notification Email dan Database di Laravel
Dan cek di url https://aplikasianda.com/horizon
maka akan muncul queue
dan jika anda membuat banyak job pun akan tampil disana sehingga proses background job
akan sangat tertata.
Demikian artikel tentang Menggunakan Laravel Horizon Package untuk Memonitoring Queue