Press "Enter" to skip to content

Tutorial Laravel Websockets – Alternatif Pusher Yang Free & Open Source

fadli 1

Tutorial Laravel Websockets – Alternatif Pusher Yang Free & Open Source.

Sebagian dari kita mungkin sudah mengenal tentang websocket, yaitu sebuah protokol HTTP yang dapat berkomunikasi secara 2 arah sehingga menjadikan sebuah aplikasi menjadi realtime app.

Dalam penerapan websocket biasanya menggunakan sebuah host, salah satu host yang paling terkenal dan mudah untuk di integrasikan yaitu Pusher.

Sebelumnya mimin sudah pernah membahas nya, silahkan buka: Panduan Lengkap Membuat Realtime App dengan Laravel + Pusher.

Tutorial Laravel Websockets – Alternatif Pusher Yang Free & Open Source

Pusher memang sudah terkenal dikalangan para developer karena kemudahan nya dalam proses integrasi nya.

Hanya saja pusher ini berbayar jika dalam sehari sudah melebihi dari limit yang telah ditentukan, untuk limit dan biaya nya bisa kamu lihat disini: Pusher Pricing Plans.

Oleh karena itu, banyak para developer yang mencari alternatif dari pusher yang free / open source, salah satu pilihan nya yaitu ke Laravel Websockets.

Laravel Websockets ini adalah Pusher Replacement, jadi sama seperti pusher, hanya saja terinstall di server kita sendiri.

Pengaturan konfigurasi nya pun sama seperti menggunakan pusher, hanya saja kita tidak perlu melakukan registrasi ke pusher nya, kita bisa mengisi key yang dibutuhkan secara dummy.

Dan contoh disini saya menggunakan laravel 10, jika kalian menggunakan versi yang lain seperti laravel 5/6/7/8/9 juga tidak masalah, karena cara nya akan sama saja.

Instalasi Laravel Websockets

Pertama kalian buka terlebih dahulu website resmi laravel websockets nya https://beyondco.de/docs/laravel-websockets/getting-started/introduction, kemudian masuk kedalam menu “installation” untuk membuka pedoman cara instalasi package nya.

Tutorial Laravel Websockets - Alternatif Pusher Yang Free & Open Source

Laravel websockets dapat diinstall via composer dengan menjalankan perintah berikut:

....
composer require beyondcode/laravel-websockets
....

Kemudian jalankan perintah berikut untuk mem-publish file migration nya.

....
php artisan vendor:publish --provider="BeyondCode\LaravelWebSockets\WebSocketsServiceProvider" --tag="migrations"
....

Selanjutnya jalankan:

....
php artisan migrate
....

Maka seharusnya akan muncul sebuah table baru dengan nama “websockets_statistics_entries” seperti gambar berikut:

Tutorial Laravel Websockets - Alternatif Pusher Yang Free & Open Source

Kita perlu juga mem-publish file websocket configuration nya dengan menjalankan perintah berikut:

....
php artisan vendor:publish --provider="BeyondCode\LaravelWebSockets\WebSocketsServiceProvider" --tag="config"
....

Maka nanti akan tercipta sebuah file baru didalam folder “../config/websockets.php”.

Pusher Replacement

Seperti yang sudah mimin katakan sebelumnya bahwasanya laravel websockets ini adalah replacement dari pusher, jadi secara konfigurasi akan sama, dan kita juga membutuhkan package yang sama.

Maka kita perlu menginstall package pusher, disini kita hanya menginstall package nya saja, kalian tidak perlu registrasi di web nya pusher.

Referensi: https://beyondco.de/docs/laravel-websockets/basic-usage/pusher.

Untuk menginstall package pusher jalankan perintah berikut:

....
composer require pusher/pusher-php-server
....

Jika sudah selesai, pada file .env, ubah nilai BROADCAST_DRIVER ke pusher.

....
BROADCAST_DRIVER=pusher
....

Tutorial Laravel Websockets - Alternatif Pusher Yang Free & Open Source

Selanjutnya, masih didalam file .env, kita juga perlu isi nilai untuk pusher nya seperti berikut:

Tutorial Laravel Websockets - Alternatif Pusher Yang Free & Open Source

PUSHER_APP_ID=cahayaappid
PUSHER_APP_KEY=cahayaappkey
PUSHER_APP_SECRET=cahayasecret
PUSHER_HOST=localhost
PUSHER_PORT=6001
PUSHER_SCHEME=http
PUSHER_APP_CLUSTER=mt1

Untuk nilai-nilai nya, kalian isi dengan data dummy saja.

_APP_ID, _APP_KEY, _APP_SECRET bisa kalian isi apa saja.

Untuk PUSHER_HOST kita isi dengan localhost, karena memang masih di local.

PUSHER_PORT diisi dengan 6001.

PUSHER_SCHEME diisi dengan http.

Mengakses Dashboard Websocket

Sekarang kita coba jalankan websocket nya, sekaligus kita akses pula dashboard websocket nya.

Kita jalankan dulu project laravel nya.

....
php artisan serve
....

Kemudian jalankan juga websocket nya dengan menggunakan perintah:

....
php artisan websockets:serve
....

Dua perintah diatas bisa kalian jalankan menggunakan 2 terminal/CMD.

Untuk dashboard websocket nya berada pada url “{{base_url}}/laravel-websockets“, contoh:

....
http://127.0.0.1:8000/laravel-websockets
....

Kalau kalian mau ganti path url nya, bisa diganti pada file konfigurasi “../config/websockets.php“.

Tutorial Laravel Websockets - Alternatif Pusher Yang Free & Open Source

Jika berhasil diakses, maka akan muncul seperti berikut:

Tutorial Laravel Websockets - Alternatif Pusher Yang Free & Open Source

Langsung saja klik button connect.

Tutorial Laravel Websockets - Alternatif Pusher Yang Free & Open Source

Jika berhasil connect, maka di dashboard nya akan muncul statistik dan report2 yang lainnya.

Membuat Event Broadcasting

Sekarang kita akan uji coba websocket nya.

Kita perlu aktifkan terlebih terlebih dahulu service provider nya didalam file “../config/app.php“, cari dan uncomment bagian “App\Providers\BroadcastServiceProvider::class”.

Tutorial Laravel Websockets - Alternatif Pusher Yang Free & Open Source

Tutorial Laravel Websockets - Alternatif Pusher Yang Free & Open Source

Setelah itu, kita coba buat event baru dengan menjalankan perintah:

....
php artisan make:event CahayaEvent
....

Maka nanti akan tercipta sebuah file event baru didalam folder “../app/Events/CahayaEvent.php“.

<?php

namespace App\Events;

use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

class CahayaEvent
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    /**
     * Create a new event instance.
     */
    public function __construct()
    {
        //
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return array<int, \Illuminate\Broadcasting\Channel>
     */
    public function broadcastOn(): array
    {
        return [
            new PrivateChannel('channel-name'),
        ];
    }
}

Agar event nya bisa berkomunikasi dengan websocket, kita perlu melakukan sedikit modifikasi seperti berikut ini:

<?php

namespace App\Events;

use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

class CahayaEvent implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    /**
     * Create a new event instance.
     */
    public function __construct()
    {
        //
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return array<int, \Illuminate\Broadcasting\Channel>
     */
    public function broadcastOn(): Channel
    {
        return new Channel('cahaya-channel');
    }
}

Pertama pada baris ke-13 kita perlu meng-implementasikan interface ShouldBroadcast.

....
class CahayaEvent implements ShouldBroadcast
{
....

Kemudian pada baris ke-30, kita ubah return nya yang tadi nya array menjadi Channel, kemudian didalam nya kita buat sebuah public channel dengan nama “cahaya-channel”:

....
public function broadcastOn(): Channel
{
    return new Channel('cahaya-channel');
}
....

Sekarang kita buat route baru terlebih dahulu agar bisa memanggil event nya.

use App\Events\CahayaEvent;
....
Route::get('call-event', function () {
    Broadcast(new CahayaEvent());
});
....

Kalian coba akses route tersebut, jika berhasil dan tidak ada masalah, maka nanti didalam Websocket Dashboard nya akan muncul seperti berikut ini:

Tutorial Laravel Websockets - Alternatif Pusher Yang Free & Open Source

Listening Event Di Client

Sekarang kita akan uji coba di client, kita akan listening event nya agar web application kita menjadi realtime app.

Kita perlu install Laravel Echo terlebih dahulu, karena ini adalah javascript library / Node Module, maka proses instalasi nya menggunakan npm, pastikan bahwa di laptop kalian sudah terinstall npm / node js.

....
npm install --save-dev laravel-echo pusher-js
....

Tutorial Laravel Websockets - Alternatif Pusher Yang Free & Open Source

Setelah proses instalasi nya selesai, buka file “../resources/js/bootstrap.js”, dan uncomment pada bagian berikut:

Tutorial Laravel Websockets - Alternatif Pusher Yang Free & Open Source

Tutorial Laravel Websockets - Alternatif Pusher Yang Free & Open Source

Diatas adalah contoh untuk laravel 10 yang menggunakan vite, untuk laravel versi 8 kebawah mungkin ada sedikit perbedaan karena menggunakan laravel mix, tapi tetap di uncomment saja script bawaan nya, karena secara fungsi akan sama saja.

Selanjutnya, pada file view nya, kita panggil app.js nya seperti berikut ini:

Tutorial Laravel Websockets - Alternatif Pusher Yang Free & Open Source

Untuk file view nya silahkan di sesuaikan sendiri.

Diatas saya memanggil nya menggunakan vite, jika teman2 menggunakan mix, maka cara panggil nya

@mix(‘resources/js/app.js’)

Selanjutnya jalankan perintah:

....
npm run dev
....

Kemudian akses file view nya di browser, buka console, dan pastikan muncul informasi connected seperti pada gambar dibawah ini:

Tutorial Laravel Websockets - Alternatif Pusher Yang Free & Open Source

Setelah persiapan nya sudah selesai, agar aplikasi nya dapat me-listen, kita perlu menambahkan script berikut didalam file view nya.

Tutorial Laravel Websockets - Alternatif Pusher Yang Free & Open Source

....
    @vite('resources/js/app.js')
    <script>
        document.addEventListener("DOMContentLoaded", function(event) {
            Echo.channel('cahaya-channel')
                .listen('CahayaEvent', (e) => {
                    alert('berhasil ngelisten');
                });
        });
    </script>
....

Pada script diatas, dibaris ke-5, kita panggil nama channel yang udah kita buat di file event nya. Dan pada baris ke-6 kita define nama file event nya (tempat dimana channel tersebut dibuat).

Setiap kali event tersebut dipanggil, maka di halaman yang ngelisten nya, akan menampilkan alert yang berisi “berhasil ngelisten”.

Simulasi Realtime App

Untuk simulasi nya, disini saya membuka 2 browser yah, browser pertama membuka halaman yang me-listen nya, browser kedua digunakan untuk memanggil event nya.

Tutorial Laravel Websockets - Alternatif Pusher Yang Free & Open Source

Passing Data Ke Event Nya

Misalkan sekarang kita ingin mengirim sebuah data array kedalam event nya, maka caranya adalah seperti berikut:

....
$data = [
    'title' => 'Tutorial Laravel Websockets',
    'event' => 'Cahaya Event',
    'author' => 'sangcahaya.id'
];

Broadcast(new CahayaEvent($data));
....

Diatas kita mempassing sebuah data array.

Kemudian pada file event nya ada perubahan menjadi seperti berikut:

Tutorial Laravel Websockets - Alternatif Pusher Yang Free & Open Source

Pada nomor 1, kita membuat public property dengan nama data.

Pada nomor 2 dan 3 kita tangkap data yang dikirim nya, dan dimasukkan nya kedalam property data.

Pada nomor 4, kita bawa data tersebut dengan menggunakan method broadcastWith().

Script untuk melisten nya kita ubah menjadi berikut:

Tutorial Laravel Websockets - Alternatif Pusher Yang Free & Open Source

Maka nanti ketika event tersebut dipanggil, dihalaman yang me-listen nya akan muncul seperti berikut:

Tutorial Laravel Websockets - Alternatif Pusher Yang Free & Open Source

Pada gambar diatas, kita bisa melihat bahwa data yang kita bawa saat memanggil event nya sudah berhasil ditampilkan pada halaman yang melisten nya.

Gimana? keren kan?

Support Us

Jika artikel ini bermanfaat untuk kamu, atau 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: