Cara menggunakan reactphp examples

Chat server yang akan kita buat pada tutorial ini bukan menggunakan protokol WebSocket melainkan hanya sebuah TCP server berbasis teks sederhana. Alasan menggunakan Ratchet tidak lain karena Ratchet menyediakan banyak abstraksi komponen yang dibangun diatas ReactPHP. Komponen dari Ratchet yang akan kita gunakan adalah IoServer.

TCP Chat server yang akan kita buat harus memiliki beberapa fitur berikut.

  1. Broadcast message ke semua user
  2. Private message ke user tertentu
  3. Penggunaan nickname untuk chat
  4. Melihat siapa yang sedang online

Pada tutorial ini kita tidak membuat aplikasi pada sisi client karena chat server yang kita buat adalah sebuah TCP server berbasis teks sederhana maka tools seperti Telnet, Netcat atau sejenisnya dapat digunakan.

Contoh saat aplikasi sedang dijalankan dapat dilihat pada video berikut ini.

Chat Server dengan beberapa klien sedang terhubung

Apa yang Diperlukan

Sebelum memulai tutorial ini berikut ini adalah hal yang kamu perlukan agar dapat mengikuti.

  1. Kamu sudah menginstall PHP (Disarankan minimal PHP v7)
  2. Kamu sudah menginstall Composer (https://getcomposer.org)
  3. Kamu memiliki TCP tools seperti Telnet, Netcat atau sejenisnya yang akan digunakan sebagai client. Telnet seharusnya tersedia pada Linux dan Windows secara default. Sedangkan pengguna MacOS dapat menggunakan nc (Netcat).

Jika kamu sudah memiliki semua yang diperlukan mari kita mulai tutorial membuat Chat server dengan Ratchet PHP.

Persiapan Struktur Direktori

Aplikasi chat server yang akan kita buat memiliki struktur direktori sebagai berikut.

- chat-server/
- bin/
- src/

Pada contoh diatas kita menamakan direktori untuk aplikasi dengan nama chat-server. Direktori bin/ akan berisi executable script untuk menjalankan Chat server. Sedangkan direktori src/ akan berisi PHP class untuk Chat server.

Menginstall Ratchet PHP

Langkah berikutnya adalah menginstall Ratchet PHP. Kita akan menggunakan Composer untuk menginstalnya. Untuk itu kita perlu membuat file composer.json yang berisi ketergantungan terhadap Ratchet.

$ cd chat-server
$ cat > composer.json
{
"autoload": {
"psr-4": {
"MyApp\\": "src"
}
},
"require": {
"cboden/ratchet": "^0.4.1"
}
}

Tekan Ctrl+D atau Command+D untuk menyimpan. Kemudian lanjutkan dengan menginstall Ratchet.

$ composer install -vvv

Membuat Skeleton Chat Server

Tujuan pembuatan skeleton ini adalah untuk memudahkan proses pembelajaran sebelum kode yang lebih lengkap dituliskan.

Kita akan memanfaatkan komponen IoServer dari Ratchet untuk implementasi TCP chat server yang akan kita buat. IoServer merupakan komponen Event-Driven ia memiliki 4 event utama yaitu:

  • onOpen: dijalankan ketika menerima koneksi dari client.
  • onMessage: dijalankan ketika menerima data dari client.
  • onClose: dijalankan ketika koneksi dari client terputus.
  • onError: dijalankan ketika terdapat error pada koneksi.

Kita akan membuat dua file yaitu bin/chat-server.php untuk menjalankan server dan src/ChatServer.php yang merupakan PHP class yang berisi logic pembuatan chat server. Struktur direktori dan file akan terlihat seperti berikut.

- chat-server/
- bin/
- chat-server.php
- src/
- ChatServer.php
- vendor/
- composer.json

Membuat Skeleton ChatServer.php Class

Pastikan kamu berada pada direktori chat-server terlebih dulu kemudian buat file src/ChatServer.php.

Pada skeleton kode diatas kita hanya mengimplementasi event onOpen dan onClose.

Membuat Skeleton chat-server.php Script

Pastikan kamu berada pada direktori chat-server terlebih dulu kemudian buat file bin/chat-server.php.

Ini adalah executable script yang digunakan untuk menjalankan server. Default port yang digunakan adalah 9191.

Melakukan Test Awal pada Chat Server

Setelah kedua file berhasil kita buat saatnya untuk melakukan tes awal pada aplikasi chat server. Untuk menjalankan server kita akan mengeksekusi file bin/chat-server.php.

$ cd chat-server
$ php ./bin/chat-server
Chat server running on port 9191
--

Untuk koneksi client buka terminal window kemudian jalankan Telnet atau Netcat untuk melakukan koneksi ke chat server pada port 9191.

$ nc localhost 9191
Welcome to chat server!

Dapat kita lihat begitu client terhubung dengan server maka client akan mendapatkan pesan “Welcome to chat server!” yang telah didefinisikan pada method onOpen. Tekan Ctrl+C untuk menutup koneksi, pada sisi server akan terlihat pesan baru.

Chat server running on port 9191
--
SERVER: Got new connection id -> 34
SERVER: Connection id -> 34 is closed

Saya harap dengan kamu sudah mulai paham alur kerja TCP chat server yang akan kita buat.

Melengkapi Pembuatan Chat Server

Kali ini kita akan memodifikasi file-file yang kita buat sebelumnya untuk mengimplementasikan fitur yang sudah disebutkan pada awal tutorial ini. Interface yang kita gunakan hanyalah sebuah teks, sehingga interaksi client dengan server juga dilakukan dengan teks.

Cara yang dapat kita lakukan adalah dengan menyediakan beberapa bentuk perintah yang dapat dieksekusi oleh client lewat command line interface (CLI). Ketika client terkoneksi ke Chat server ia akan disuguhkan daftar perintah yang dapat ia ketik pada terminal. Tampilannya adalah sebagai berikut.

**************************************
Welcome to the Club - Enjoy your chat!
**************************************
List of commands:
/nick NICKNAME Register a nickname
/msg MESSAGE Send a message to all
/pm NICKNAME MESSAGE Send private message
/users Get list of online users
/help Show this message
/quit Quit chat club

Sebagian besar logic chat server ada pada event onMessage dimana event tersebut akan dijalankan ketika server menerima data dari client.

Melengkapi ChatServer.php Class

Buka kembali file src/ChatServer.php untuk diubah sesuai dengan kode sumber dibawah ini.

Melengkapi chat-server Script

Kita juga akan melakukan perubahan pada script untuk menjalankan server. Dimana sekarang script menerima inputan untuk bind address dan port number. Ubah file bin/chat-server.php seperti dibawah ini.

Menjalankan Chat Server

Saatnya melakukan test pada Chat server yang sudah kita lengkapi kodenya. Buka beberapa terminal window 1 untuk server dan beberapa lainnya untuk client agar kamu bisa melihat secara langsung interaksi antar user dalam chat room.

$ php ./bin/chat-server.php
Chat server running on 0.0.0.0:9191.
--

Pada contoh diatas saya menjalankan chat server tanpa melakukan set parameter sehingga secara default server akan bind ke semua interface yaitu 0.0.0.0 dan port 9191.

Berikutnya pada terminal window yang lain gunakan tools Telnet atau Netcat untuk terhubung ke chat server.

$ nc localhost 9191
**************************************
Welcome to the Club - Enjoy your chat!
**************************************
List of commands:
/nick NICKNAME Register a nickname
/msg MESSAGE Send a message to all
/pm NICKNAME MESSAGE Send private message
/users Get list of online users
/help Show this message
/quit Quit chat club

Mengubah Nickname

Jika kamu belum melakukan registrasi nickname maka kamu belum dapat mengirim pesan ke pengguna lain. Untuk mengubah nickname gunakan perintah /nick.

/nick rioSUCCESS: Your nickname has changed to rio.

Mengirim Pesan ke Semua Pengguna

Untuk mengirim pesan ke semua pengguna gunakan perintah /msg. Pesan tersebut akan terkirim kesemua pengguna baik yang sudah atau belum meliki nickname.

/msg Hello there?

Pada terminal window pengguna lain seharusnya akan tampil yang dikirimkan user rio.

>> User `rio` has joined channel.>> rio: Hello there?

Melihat Siapa yang Online

Untuk melihat siapa yang sedang online saat ini kamu dapat menggunakan perintah /users. Perintah tersebut akan menampilkan daftar user yang sedang online dan juga jumlah anonymous user. Anonymous adalah user yang membuat nickname. Contoh output tampilan seperti dibawah.

/usersCurrently we have 2 users online and 1 anonymous.
-------------------------------------------------
- rio
- john

Mengirim Private Message

Private Message adalah fitur untuk mengirim pesan yang hanya ditujukan kepada satu pengguna saja. Pesan ini tidak disebarkan kepada pengguna lain yang sedang online dichat room. Perintah yang digunakan adalah /pm seperti yang ditunjukkan contoh dibawah ini.

/pm rio Hi Rio, how are you?

Pada terminal window milik user rio harusnya muncul pesan pribadi yang dikirimkan.

>> PM from `john` -> Hi Rio, how are you?

Catatan

Jika kamu ingin menjalankan chat server pada interface atau port lain gunakan environment variable seperti yang dicontohkan berikut ini.

$ CHAT_BIND_ADDR=192.168.1.7 \
> CHAT_SERVER_PORT=8001 \
> php ./bin/chat-server.php
Chat server running on 192.168.1.7:8001.
--

Pada contoh diatas server dijalankan pada alamat IP 192.168.1.7 dan port 8001.

Source Code Chat Server

Source code dari chat server yang ditunjukkan pada tutorial kali ini dapat kamu temukan pada URL berikut.