Server NodeJs untuk siaran Laravel Echo dengan Socket.io.
Berikut ini diperlukan agar dapat berfungsi dengan baik.
Informasi tambahan mengenai penyiaran dengan Laravel dapat ditemukan di dokumen resmi: https://laravel.com/docs/master/broadcasting
Instal paket npm secara global dengan perintah berikut:
$ npm install -g laravel-echo-server
Jalankan perintah init di direktori proyek Anda:
$ laravel-echo-server init
Alat cli akan membantu Anda menyiapkan file laravel-echo-server.json di direktori root proyek Anda. File ini akan dimuat oleh server saat start up. Anda dapat mengedit file ini nanti untuk mengelola konfigurasi server Anda.
Laravel Echo Server memaparkan API http ringan untuk melakukan fungsi penyiaran. Untuk tujuan keamanan, akses ke titik akhir ini dari perujuk http harus diautentikasi dengan ID dan kunci APP. Ini dapat dihasilkan menggunakan perintah cli:
$ laravel-echo-server client:add APP_ID
Jika Anda menjalankan client:add
tanpa argumen id aplikasi, argumen tersebut akan dibuat untuk Anda. Setelah menjalankan perintah ini, id dan kunci klien akan ditampilkan dan disimpan di file laravel-echo-server.json .
Dalam contoh ini, permintaan akan diizinkan selama id dan kunci aplikasi diberikan bersama permintaan http.
Request Headers
Authorization: Bearer skti68i...
or
http://app.dev:6001/apps/APP_ID/channels?auth_key=skti68i...
Anda dapat menghapus klien dengan laravel-echo-server client:remove APP_ID
di direktori root proyek Anda, jalankan
$ laravel-echo-server start
di direktori root proyek Anda, jalankan
$ laravel-echo-server stop
Edit konfigurasi default server dengan menambahkan opsi ke file laravel-echo-server.json Anda.
Judul | Bawaan | Keterangan |
---|---|---|
apiOriginAllow | {} | Konfigurasi untuk mengizinkan API diakses melalui CORS. Contoh |
authEndpoint | /broadcasting/auth | Rute yang mengautentikasi saluran pribadi |
authHost | http://localhost | Host server yang mengautentikasi saluran pribadi dan kehadiran |
database | redis | Basis data digunakan untuk menyimpan data yang harus tetap ada, seperti anggota saluran kehadiran. Opsi saat ini adalah redis dan sqlite |
databaseConfig | {} | Konfigurasi untuk driver database yang berbeda Contoh |
devMode | false | Menambahkan logging tambahan untuk tujuan pengembangan |
host | null | Host dari server socket.io mis. app.dev . null akan menerima koneksi pada alamat IP mana pun |
port | 6001 | Port tempat server socket.io harus dijalankan |
protocol | http | Harus berupa http atau https |
sslCertPath | '' | Jalur ke sertifikat SSL server Anda |
sslKeyPath | '' | Jalur ke kunci SSL server Anda |
sslCertChainPath | '' | Jalur ke rantai sertifikat SSL server Anda |
sslPassphrase | '' | Frasa sandi yang digunakan untuk sertifikat (jika ada) |
socketio | {} | Opsi untuk diteruskan ke instance socket.io (opsi yang tersedia) |
subscribers | {"http": true, "redis": true} | Memungkinkan untuk menonaktifkan pelanggan satu per satu. Pelanggan yang tersedia: http dan redis |
Jika file .env ditemukan di direktori yang sama dengan file laravel-echo-server.json, opsi berikut dapat diganti:
authHost
: LARAVEL_ECHO_SERVER_AUTH_HOST
Catatan : Opsi ini akan kembali ke opsi LARAVEL_ECHO_SERVER_HOST
sebagai default jika diatur dalam file .env.host
: LARAVEL_ECHO_SERVER_HOST
port
: LARAVEL_ECHO_SERVER_PORT
devMode
: LARAVEL_ECHO_SERVER_DEBUG
databaseConfig.redis.host
: LARAVEL_ECHO_SERVER_REDIS_HOST
databaseConfig.redis.port
: LARAVEL_ECHO_SERVER_REDIS_PORT
databaseConfig.redis.password
: LARAVEL_ECHO_SERVER_REDIS_PASSWORD
protocol
: LARAVEL_ECHO_SERVER_PROTO
sslKeyPath
: LARAVEL_ECHO_SERVER_SSL_KEY
sslCertPath
: LARAVEL_ECHO_SERVER_SSL_CERT
sslPassphrase
: LARAVEL_ECHO_SERVER_SSL_PASS
sslCertChainPath
: LARAVEL_ECHO_SERVER_SSL_CHAIN
Catatan: Library ini saat ini hanya mendukung penayangan dari http atau https, tidak keduanya.
Jika Anda kesulitan mengimplementasikan SSL dengan paket ini, Anda dapat mencoba menggunakan modul proxy dalam Apache atau NginX. Pada dasarnya, alih-alih menghubungkan lalu lintas websocket Anda ke https://yourserver.dev:6001/socket.io?..... dan mencoba mengamankannya, Anda dapat menghubungkan lalu lintas websocket Anda ke https://yourserver.dev/socket .io. Di belakang layar, modul proxy Apache atau NginX akan dikonfigurasi untuk mencegat permintaan /socket.io, dan secara internal mengarahkan permintaan tersebut ke server gema Anda melalui non-ssl pada port 6001. Hal ini membuat semua lalu lintas terenkripsi antara browser dan web server, karena server web Anda masih akan melakukan enkripsi/dekripsi SSL. Satu-satunya hal yang tidak aman adalah lalu lintas antara server web Anda dan server Echo Anda, yang mungkin dapat diterima dalam banyak kasus.
#the following would go within the server{} block of your web server config
location /socket.io {
proxy_pass http://laravel-echo-server:6001; #could be localhost if Echo and NginX are on the same box
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
RewriteCond %{REQUEST_URI} ^/socket.io [NC]
RewriteCond %{QUERY_STRING} transport=websocket [NC]
RewriteRule /(.*) ws://localhost:6001/$1 [P,L]
ProxyPass /socket.io http://localhost:6001/socket.io
ProxyPassReverse /socket.io http://localhost:6001/socket.io
Direktori kerja di mana laravel-echo-server
akan mencari file konfigurasi laravel-echo-server.json
dapat diteruskan ke perintah start
melalui parameter --dir
seperti: laravel-echo-server start --dir=/var/www/html/example.com/configuration
Laravel Echo Server berlangganan event masuk dengan dua metode: Redis & Http.
Aplikasi inti Anda dapat menggunakan Redis untuk mempublikasikan acara ke saluran. Laravel Echo Server akan berlangganan saluran tersebut dan menyiarkan pesan tersebut melalui socket.io.
Dengan menggunakan Http, Anda juga dapat mempublikasikan acara ke Laravel Echo Server dengan cara yang sama seperti yang Anda lakukan dengan Redis dengan mengirimkan channel
dan message
ke titik akhir siaran. Anda perlu membuat kunci API seperti yang dijelaskan di bagian Klien API dan memberikan kunci API yang benar.
Permintaan Titik Akhir
POST http://app.dev:6001/apps/your-app-id/events?auth_key=skti68i...
Badan Permintaan
{
"channel" : " channel-name " ,
"name" : " event-name " ,
"data" : {
"key" : " value "
},
"socket_id" : " h3nAdb134tbvqwrg "
}
saluran - Nama saluran untuk menyiarkan acara. Untuk saluran privat atau kehadiran, tambahkan private-
atau presence-
. saluran - Alih-alih satu saluran, Anda dapat menyiarkan ke berbagai saluran dengan 1 permintaan. name - String yang mewakili kunci peristiwa dalam aplikasi Anda. data - Data yang ingin Anda siarkan ke saluran. socket_id (opsional) - ID soket pengguna yang memulai acara. Saat ini, server hanya akan "menyiarkan ke orang lain".
Pelanggan HTTP kompatibel dengan pelanggan Laravel Pusher. Cukup konfigurasikan host dan port untuk server Socket.IO Anda dan atur id aplikasi dan kunci di config/broadcasting.php. Rahasia tidak diperlukan.
' pusher ' => [
' driver ' => ' pusher ' ,
' key ' => env ( ' PUSHER_KEY ' ),
' secret ' => null ,
' app_id ' => env ( ' PUSHER_APP_ID ' ),
' options ' => [
' host ' => ' localhost ' ,
' port ' => 6001 ,
' scheme ' => ' http '
],
],
Anda sekarang dapat mengirim acara menggunakan HTTP, tanpa menggunakan Redis. Ini juga memungkinkan Anda menggunakan API Pusher untuk membuat daftar saluran/pengguna seperti yang dijelaskan di perpustakaan Pusher PHP
API HTTP memperlihatkan titik akhir yang memungkinkan Anda mengumpulkan informasi tentang server dan saluran yang sedang berjalan.
Status Dapatkan jumlah total klien, waktu aktif server, dan penggunaan memori.
GET /apps/:APP_ID/status
Saluran Daftar semua saluran.
GET /apps/:APP_ID/channels
Saluran Dapatkan informasi tentang saluran tertentu.
GET /apps/:APP_ID/channels/:CHANNEL_NAME
Pengguna Saluran Daftar pengguna di saluran.
GET /apps/:APP_ID/channels/:CHANNEL_NAME/users
Akses lintas domain dapat ditentukan dalam file laravel-echo-server.json dengan allowCors
di apiOriginAllow
menjadi true
. Anda kemudian dapat mengatur CORS Access-Control-Allow-Origin, Access-Control-Allow-Methods sebagai string yang dipisahkan koma (GET dan POST diaktifkan secara default) dan Access-Control-Allow-Headers yang dapat diterima API.
Contoh di bawah ini:
{
"apiOriginAllow" :{
"allowCors" : true ,
"allowOrigin" : " http://127.0.0.1 " ,
"allowMethods" : " GET, POST " ,
"allowHeaders" : " Origin, Content-Type, X-Auth-Token, X-Requested-With, Accept, Authorization, X-CSRF-TOKEN, X-Socket-Id "
}
}
Hal ini memungkinkan Anda mengirim permintaan ke API melalui AJAX dari aplikasi yang mungkin berjalan di domain yang sama tetapi port berbeda atau domain yang sama sekali berbeda.
Untuk mempertahankan data saluran kehadiran, terdapat dukungan untuk penggunaan Redis atau SQLite sebagai penyimpan kunci/nilai. Kuncinya adalah nama saluran, dan nilainya adalah daftar keberadaan anggota saluran.
Setiap driver database dapat dikonfigurasi dalam file laravel-echo-server.json di bawah properti databaseConfig
. Opsi-opsi tersebut diteruskan ke penyedia basis data, sehingga pengembang bebas mengaturnya sesuai keinginan.
Misalnya, jika Anda ingin meneruskan konfigurasi khusus ke Redis:
{
"databaseConfig" : {
"redis" : {
"port" : " 3001 " ,
"host" : " redis.app.dev " ,
"keyPrefix" : " my-redis-prefix "
}
}
}
Catatan: Tidak ada skema (http/https dll) yang boleh digunakan untuk alamat host
Daftar lengkap opsi Redis dapat ditemukan di sini.
Misalnya, jika Anda ingin menggunakan redis-sentinel, Anda harus meneruskan konfigurasi khusus :
"databaseConfig" : {
"redis" : {
"sentinels" : [
{
"host" : " redis-sentinel-0 " ,
"port" : 26379
},
{
"host" : " redis-sentinel-1 " ,
"port" : 26379
}
{
"host" : " redis-sentinel-2 " ,
"port" : 26379
}
],
"name" : " mymaster " ,
"sentinelPassword" : " redis-password "
},
},
Untuk informasi lebih lanjut tentang konfigurasi redis sentinel Anda dapat memeriksa ini
Dengan SQLite Anda mungkin tertarik untuk mengubah jalur penyimpanan database.
{
"databaseConfig" : {
"sqlite" : {
"databasePath" : " /path/to/laravel-echo-server.sqlite "
}
}
}
Catatan 1: Jalurnya relatif terhadap root aplikasi Anda, bukan sistem Anda.
Catatan 2: node-sqlite3 diperlukan untuk database ini. Silakan instal sebelum menggunakan.
npm install sqlite3 -g
Saat pengguna bergabung dengan saluran kehadiran, data autentikasi saluran kehadiran mereka disimpan menggunakan Redis.
Meskipun saluran kehadiran berisi daftar pengguna, ada kalanya pengguna bergabung dengan saluran kehadiran beberapa kali. Misalnya, hal ini akan terjadi ketika membuka beberapa tab browser. Dalam situasi ini peristiwa "bergabung" dan "keluar" hanya dipancarkan ke pengguna pertama dan terakhir.
Secara opsional, Anda dapat mengonfigurasi laravel-echo-server untuk menerbitkan peristiwa pada setiap pembaruan ke saluran kehadiran, dengan mengatur databaseConfig.publishPresence
ke true
:
{
"database" : " redis " ,
"databaseConfig" : {
"redis" : {
"port" : " 6379 " ,
"host" : " localhost "
},
"publishPresence" : true
}
}
Anda dapat menggunakan integrasi Redis Laravel, untuk memicu kode Aplikasi dari sana:
Redis :: subscribe ([ ' PresenceChannelUpdated ' ], function ( $ message ) {
var_dump ( $ message );
});
Lihat dokumentasi resmi Laravel untuk informasi lebih lanjut. https://laravel.com/docs/master/broadcasting#introduction
Anda dapat menyertakan perpustakaan klien socket.io dari server Anda yang sedang berjalan. Misalnya, jika server Anda berjalan di app.dev:6001
Anda seharusnya dapat menambahkan tag skrip ke html Anda seperti:
<script src="//app.dev:6001/socket.io/socket.io.js"></script>
Catatan: Saat menggunakan pustaka klien socket.io dari server Anda yang sedang berjalan, ingatlah untuk memeriksa apakah variabel global io
telah ditentukan sebelum berlangganan acara.
μWebSockets secara resmi sudah tidak digunakan lagi. Saat ini tidak ada dukungan untuk µWebSockets di Socket.IO, tetapi mungkin ada dukungan ClusterWS baru yang masuk. Sedangkan Laravel Echo Server akan menggunakan mesin ws
secara default sampai ada pilihan lain.