NodeJs-Server für Laravel Echo-Broadcasting mit Socket.io.
Folgendes ist für eine ordnungsgemäße Funktion erforderlich.
Weitere Informationen zum Senden mit Laravel finden Sie in den offiziellen Dokumenten: https://laravel.com/docs/master/broadcasting
Installieren Sie das NPM-Paket global mit dem folgenden Befehl:
$ npm install -g laravel-echo-server
Führen Sie den Befehl init in Ihrem Projektverzeichnis aus:
$ laravel-echo-server init
Das CLI-Tool hilft Ihnen beim Einrichten einer laravel-echo-server.json- Datei im Stammverzeichnis Ihres Projekts. Diese Datei wird beim Start vom Server geladen. Sie können diese Datei später bearbeiten, um die Konfiguration Ihres Servers zu verwalten.
Der Laravel Echo Server stellt eine einfache http-API zur Verfügung, um Broadcasting-Funktionen auszuführen. Aus Sicherheitsgründen muss der Zugriff auf diese Endpunkte von HTTP-Referrern mit einer APP-ID und einem Schlüssel authentifiziert werden. Dies kann mit dem Befehl cli generiert werden:
$ laravel-echo-server client:add APP_ID
Wenn Sie client:add
ohne ein App-ID-Argument ausführen, wird eines für Sie generiert. Nach der Ausführung dieses Befehls werden die Client-ID und der Schlüssel angezeigt und in der Datei laravel-echo-server.json gespeichert.
In diesem Beispiel sind Anfragen zulässig, solange sowohl die App-ID als auch der Schlüssel bei HTTP-Anfragen bereitgestellt werden.
Request Headers
Authorization: Bearer skti68i...
or
http://app.dev:6001/apps/APP_ID/channels?auth_key=skti68i...
Sie können Clients mit laravel-echo-server client:remove APP_ID
entfernen
Führen Sie im Stammverzeichnis Ihres Projekts Folgendes aus:
$ laravel-echo-server start
Führen Sie im Stammverzeichnis Ihres Projekts Folgendes aus:
$ laravel-echo-server stop
Bearbeiten Sie die Standardkonfiguration des Servers, indem Sie Optionen zu Ihrer Datei laravel-echo-server.json hinzufügen.
Titel | Standard | Beschreibung |
---|---|---|
apiOriginAllow | {} | Konfiguration, um den Zugriff auf die API über CORS zu ermöglichen. Beispiel |
authEndpoint | /broadcasting/auth | Die Route, die private Kanäle authentifiziert |
authHost | http://localhost | Der Host des Servers, der private Kanäle und Präsenzkanäle authentifiziert |
database | redis | Datenbank zum Speichern von Daten, die bestehen bleiben sollen, z. B. Präsenzkanalmitglieder. Optionen sind derzeit redis und sqlite |
databaseConfig | {} | Konfigurationen für die verschiedenen Datenbanktreiber Beispiel |
devMode | false | Fügt zusätzliche Protokollierung für Entwicklungszwecke hinzu |
host | null | Der Host des socket.io-Servers, z. B. app.dev . null akzeptiert Verbindungen auf jeder IP-Adresse |
port | 6001 | Der Port, auf dem der socket.io-Server laufen soll |
protocol | http | Muss entweder http oder https sein |
sslCertPath | '' | Der Pfad zum SSL-Zertifikat Ihres Servers |
sslKeyPath | '' | Der Pfad zum SSL-Schlüssel Ihres Servers |
sslCertChainPath | '' | Der Pfad zur SSL-Zertifikatskette Ihres Servers |
sslPassphrase | '' | Die für das Zertifikat zu verwendende Passphrase (falls zutreffend) |
socketio | {} | Optionen zur Übergabe an die socket.io-Instanz (verfügbare Optionen) |
subscribers | {"http": true, "redis": true} | Ermöglicht die individuelle Deaktivierung von Abonnenten. Verfügbare Abonnenten: http und redis |
Wenn eine .env-Datei im selben Verzeichnis wie die Datei laravel-echo-server.json gefunden wird, können die folgenden Optionen überschrieben werden:
authHost
: LARAVEL_ECHO_SERVER_AUTH_HOST
Hinweis : Diese Option greift standardmäßig auf die Option LARAVEL_ECHO_SERVER_HOST
zurück, wenn diese in der .env-Datei festgelegt ist.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
Hinweis: Diese Bibliothek unterstützt derzeit nur die Bereitstellung über http oder https, nicht über beide.
Wenn Sie Schwierigkeiten haben, SSL mit diesem Paket zu implementieren, können Sie die Verwendung eines Proxy-Moduls in Apache oder NginX in Betracht ziehen. Anstatt Ihren Websocket-Verkehr mit https://yourserver.dev:6001/socket.io?..... zu verbinden und zu versuchen, ihn zu sichern, können Sie Ihren Websocket-Verkehr im Wesentlichen mit https://yourserver.dev/socket verbinden .io. Hinter den Kulissen wird das Proxy-Modul von Apache oder NginX so konfiguriert, dass es Anfragen für /socket.io abfängt und diese intern über Nicht-SSL an Port 6001 an Ihren Echo-Server umleitet. Dadurch bleibt der gesamte Datenverkehr zwischen Browser und Web verschlüsselt Server, da Ihr Webserver weiterhin die SSL-Verschlüsselung/Entschlüsselung übernimmt. Das Einzige, was ungesichert bleibt, ist der Datenverkehr zwischen Ihrem Webserver und Ihrem Echo-Server, was in vielen Fällen akzeptabel sein könnte.
#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
Das Arbeitsverzeichnis, in dem laravel-echo-server
nach der Konfigurationsdatei laravel-echo-server.json
sucht, kann über den Parameter --dir
wie folgt an den start
übergeben werden: laravel-echo-server start --dir=/var/www/html/example.com/configuration
Der Laravel Echo Server abonniert eingehende Ereignisse mit zwei Methoden: Redis und Http.
Ihre Kernanwendung kann Redis verwenden, um Ereignisse auf Kanälen zu veröffentlichen. Der Laravel Echo Server abonniert diese Kanäle und sendet diese Nachrichten über socket.io.
Mit HTTP können Sie Ereignisse auch auf dem Laravel Echo Server veröffentlichen, wie Sie es mit Redis tun würden, indem Sie einen channel
und message
an den Broadcast-Endpunkt senden. Sie müssen einen API-Schlüssel generieren, wie im Abschnitt „API-Clients“ beschrieben, und den richtigen API-Schlüssel angeben.
Endpunkt anfordern
POST http://app.dev:6001/apps/your-app-id/events?auth_key=skti68i...
Anforderungstext
{
"channel" : " channel-name " ,
"name" : " event-name " ,
"data" : {
"key" : " value "
},
"socket_id" : " h3nAdb134tbvqwrg "
}
Kanal – Der Name des Kanals, an den ein Ereignis übertragen werden soll. Für Privat- oder Präsenzkanäle stellen Sie private-
oder presence-
voran. Kanäle – Anstelle eines einzelnen Kanals können Sie mit einer Anfrage an eine Reihe von Kanälen senden. name – Eine Zeichenfolge, die den Ereignisschlüssel in Ihrer App darstellt. Daten – Daten, die Sie an den Kanal senden möchten. socket_id (optional) – Die Socket-ID des Benutzers, der das Ereignis initiiert hat. Wenn vorhanden, sendet der Server nur „an andere“.
Der HTTP-Abonnent ist mit dem Laravel Pusher-Abonnenten kompatibel. Konfigurieren Sie einfach den Host und den Port für Ihren Socket.IO-Server und legen Sie die App-ID und den Schlüssel in config/broadcasting.php fest. Geheimnis ist nicht erforderlich.
' pusher ' => [
' driver ' => ' pusher ' ,
' key ' => env ( ' PUSHER_KEY ' ),
' secret ' => null ,
' app_id ' => env ( ' PUSHER_APP_ID ' ),
' options ' => [
' host ' => ' localhost ' ,
' port ' => 6001 ,
' scheme ' => ' http '
],
],
Sie können jetzt Ereignisse über HTTP senden, ohne Redis zu verwenden. Dadurch können Sie auch die Pusher-API verwenden, um Kanäle/Benutzer aufzulisten, wie in der Pusher-PHP-Bibliothek beschrieben
Die HTTP-API stellt Endpunkte bereit, mit denen Sie Informationen über Ihren laufenden Server und Ihre Kanäle sammeln können.
Status Rufen Sie die Gesamtzahl der Clients, die Betriebszeit des Servers und die Speichernutzung ab.
GET /apps/:APP_ID/status
Kanäle Liste aller Kanäle.
GET /apps/:APP_ID/channels
Kanal Informationen zu einem bestimmten Kanal abrufen.
GET /apps/:APP_ID/channels/:CHANNEL_NAME
Kanalbenutzer Liste der Benutzer auf einem Kanal.
GET /apps/:APP_ID/channels/:CHANNEL_NAME/users
Der domänenübergreifende Zugriff kann in der Datei laravel-echo-server.json angegeben werden, indem allowCors
in apiOriginAllow
in true
“ geändert wird. Anschließend können Sie CORS Access-Control-Allow-Origin, Access-Control-Allow-Methods als durch Kommas getrennte Zeichenfolge (GET und POST sind standardmäßig aktiviert) und die Access-Control-Allow-Header festlegen, die die API empfangen kann.
Beispiel unten:
{
"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 "
}
}
Dadurch können Sie über AJAX Anfragen an die API von einer App senden, die möglicherweise auf derselben Domäne, aber einem anderen Port oder einer völlig anderen Domäne ausgeführt wird.
Um Präsenzkanaldaten beizubehalten, wird die Verwendung von Redis oder SQLite als Schlüssel-/Wertspeicher unterstützt. Der Schlüssel ist der Kanalname und der Wert ist die Liste der Anwesenheitskanalmitglieder.
Jeder Datenbanktreiber kann in der Datei laravel-echo-server.json unter der Eigenschaft databaseConfig
konfiguriert werden. Die Optionen werden an den Datenbankanbieter weitergeleitet, sodass Entwickler diese nach Belieben einrichten können.
Wenn Sie beispielsweise eine benutzerdefinierte Konfiguration an Redis übergeben möchten:
{
"databaseConfig" : {
"redis" : {
"port" : " 3001 " ,
"host" : " redis.app.dev " ,
"keyPrefix" : " my-redis-prefix "
}
}
}
Hinweis: Für die Hostadresse sollte kein Schema (http/https usw.) verwendet werden
Eine vollständige Liste der Redis-Optionen finden Sie hier.
Wenn Sie beispielsweise redis-sentinel verwenden möchten, müssen Sie eine benutzerdefinierte Konfiguration übergeben:
"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 "
},
},
Weitere Informationen zur Redis-Sentinel-Konfiguration finden Sie hier
Bei SQLite könnten Sie daran interessiert sein, den Pfad zu ändern, in dem die Datenbank gespeichert wird.
{
"databaseConfig" : {
"sqlite" : {
"databasePath" : " /path/to/laravel-echo-server.sqlite "
}
}
}
Hinweis 1: Der Pfad ist relativ zum Stammverzeichnis Ihrer Anwendung, nicht zu Ihrem System.
Hinweis 2: Für diese Datenbank ist node-sqlite3 erforderlich. Bitte installieren Sie es vor der Verwendung.
npm install sqlite3 -g
Wenn Benutzer einem Präsenzkanal beitreten, werden die Authentifizierungsdaten ihres Präsenzkanals mithilfe von Redis gespeichert.
Während Präsenzkanäle eine Liste von Benutzern enthalten, gibt es Fälle, in denen ein Benutzer einem Präsenzkanal mehrmals beitritt. Dies würde beispielsweise beim Öffnen mehrerer Browser-Registerkarten auftreten. In dieser Situation werden „Beitreten“- und „Verlassen“-Ereignisse nur an die erste und letzte Instanz des Benutzers ausgegeben.
Optional können Sie laravel-echo-server so konfigurieren, dass bei jedem Update ein Ereignis auf einem Präsenzkanal veröffentlicht wird, indem Sie databaseConfig.publishPresence
auf true
setzen:
{
"database" : " redis " ,
"databaseConfig" : {
"redis" : {
"port" : " 6379 " ,
"host" : " localhost "
},
"publishPresence" : true
}
}
Sie können die Redis-Integration von Laravel verwenden, um von dort aus Anwendungscode auszulösen:
Redis :: subscribe ([ ' PresenceChannelUpdated ' ], function ( $ message ) {
var_dump ( $ message );
});
Weitere Informationen finden Sie in der offiziellen Laravel-Dokumentation. https://laravel.com/docs/master/broadcasting#introduction
Sie können die socket.io-Clientbibliothek von Ihrem laufenden Server einbinden. Wenn Ihr Server beispielsweise unter app.dev:6001
läuft, sollten Sie in der Lage sein, Ihrem HTML-Code ein Skript-Tag wie folgt hinzuzufügen:
<script src="//app.dev:6001/socket.io/socket.io.js"></script>
Hinweis: Wenn Sie die Socket.io-Clientbibliothek von Ihrem laufenden Server aus verwenden, denken Sie daran, zu überprüfen, ob die globale Variable io
definiert ist, bevor Sie Ereignisse abonnieren.
µWebSockets ist offiziell veraltet. Derzeit gibt es keine Unterstützung für µWebSockets in Socket.IO, aber möglicherweise wird die neue ClusterWS-Unterstützung in Kürze verfügbar sein. In der Zwischenzeit verwendet Laravel Echo Server standardmäßig ws
-Engine, bis es eine andere Option gibt.