Heim >PHP-Framework >Denken Sie an PHP >Verwendung des Nginx-Reverse-Proxy-Websockets in ThinkPHP6
Websocket hat sich in den letzten Jahren zu einem sehr wichtigen Kommunikationsprotokoll in Internetanwendungen entwickelt. ThinkPHP6 bietet als hervorragendes PHP-Entwicklungsframework auch Unterstützung für Websocket. Bei der Verwendung von Websocket treten jedoch normalerweise Probleme wie domänenübergreifender und Lastausgleich auf. Daher stellen wir in diesem Artikel die Verwendung von Nginx-Reverse-Proxy-Websocket in ThinkPHP6 vor.
Zunächst müssen wir die Grundprinzipien und Implementierungsmethoden von Websocket klären. Websocket nutzt den Handshake-Prozess des HTTP-Protokolls zum Verbindungsaufbau. Nach dem Verbindungsaufbau wird das TCP-Protokoll für die eigentliche Datenübertragung verwendet. Daher müssen wir für die Verwendung von Websocket sowohl den HTTP- als auch den TCP-Teil berücksichtigen.
In praktischen Anwendungen verwenden wir normalerweise den Nginx-Reverse-Proxy für den Websocket-Lastausgleich und die domänenübergreifende Verarbeitung. Lassen Sie uns vorstellen, wie Sie den Nginx-Reverse-Proxy-Websocket in ThinkPHP6 verwenden.
1. Nginx-Konfiguration
Wir können Reverse-Proxy für Websocket über die Nginx-Konfigurationsdatei implementieren. Zuerst müssen wir einen Upstream im http-Block deklarieren:
http { upstream websocket_servers { server 127.0.0.1:8000; server 127.0.0.1:8001; } }
In der obigen Konfiguration haben wir einen Upstream namens websocket_servers deklariert, der zwei Serveradressen enthält. Wenn der Client Websocket anfordert, leitet Nginx die Anforderung auf diese Weise gemäß dem Lastausgleichsalgorithmus an einen der Server weiter.
Fügen Sie als Nächstes die folgende Konfiguration im Serverblock hinzu:
server { listen 80; server_name example.com; # 处理WebSocket请求 location /ws { proxy_pass http://websocket_servers; proxy_set_header Host $http_host; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_read_timeout 86400; } # 处理其他请求 location / { proxy_pass http://backend_server; proxy_set_header Host $http_host; } }
Die obige Konfiguration überwacht Port 80 und teilt die Anfrage in zwei Situationen auf. Wenn der Client /ws anfordert, wird es an die oben deklarierten websocket_servers weitergeleitet; andere Anfragen werden an backend_server weitergeleitet.
Für Websocket-Anfragen müssen wir einige spezielle Anfrageheader festlegen, z. B. „Upgrade“ und „Verbindung“. Hier legen wir diese Anforderungsheader über Proxy_set_header fest. Beachten Sie, dass der Proxy_Pass hier das http-Protokoll und nicht das https-Protokoll sein muss.
2. ThinkPHP6-Konfiguration
In ThinkPHP6 müssen wir den Websocket-Dienst über Swoole Server starten. Mit dem folgenden Code können wir einen einfachen WebSocket-Dienst starten:
<?php use SwooleWebSocketServer; use SwooleHttpRequest; use SwooleWebSocketFrame; $server = new Server("0.0.0.0", 8000, SWOOLE_PROCESS, SWOOLE_SOCK_TCP | SWOOLE_SSL); $server->on("start", function (Server $server) { echo "Swoole WebSocket Server is started at http://0.0.0.0:8000 "; }); $server->on("open", function (Server $server, SwooleHttpRequest $request) { echo "connection open: {$request->fd} "; $server->push($request->fd, "hello, welcome "); }); $server->on("message", function (Server $server, Frame $frame) { echo "received message: {$frame->data} "; $server->push($frame->fd, json_encode(["hello", "world"])); }); $server->on("close", function (Server $server, $fd) { echo "connection close: {$fd} "; }); $server->start();
Im obigen Code haben wir einen WebSocket-Server erstellt und Port 8000 abgehört. Im offenen Event erhalten wir eine Verbindungsanfrage vom Kunden und senden ihm eine Willkommensnachricht. Im Nachrichtenereignis empfangen wir die vom Client gesendete Nachricht und antworten mit einer Nachricht. (Die Antwortnachricht hier ist nur ein einfaches Beispiel und muss entsprechend den tatsächlichen Anforderungen in tatsächlichen Anwendungen geändert werden.)
Hier ist zu beachten, dass wir bei Verwendung des Nginx-Reverse-Proxy-Websockets den WebSocket-Server von Swoole an den TCP-Port binden müssen unter dem Protokoll, nicht der Port des HTTP-Protokolls. Daher müssen wir den 3. Parameter auf SWOOLE_SOCK_TCP setzen.
Wir können auch den Multiprozessmodus von Swoole verwenden, um die Leistung zu verbessern. Im 4. Parameter können wir ihn auf SWOOLE_PROCESS setzen und eine Zahl angeben, die die Anzahl der Prozesse darstellt.
In tatsächlichen Anwendungen müssen wir möglicherweise einige Datenbank- oder Cache-Funktionen im Websocket-Dienst verwenden, die einfach über die Abhängigkeitsinjektionsfunktion von ThinkPHP6 implementiert werden können.
3. Front-End-Code
Schließlich werfen wir einen Blick darauf, wie der Front-End-Code Websocket verwendet.
var ws_url = "ws://example.com/ws"; // 注意这里的协议必须是ws var websocket = new WebSocket(ws_url); websocket.onopen = function () { console.log("WebSocket opened"); }; websocket.onmessage = function (evt) { console.log("WebSocket received message:", evt.data); }; websocket.onclose = function () { console.log("WebSocket closed"); };
Im obigen Code kommunizieren wir mit dem Server über das WebSocket-Objekt. Wenn eine Verbindung geöffnet wird, wird das Ereignis „onopen“ ausgelöst, wenn eine Nachricht empfangen wird, wird das Ereignis „onmessage“ ausgelöst, und wenn die Verbindung geschlossen wird, wird das Ereignis „onclose“ ausgelöst.
Es ist zu beachten, dass das Protokoll hier ws sein muss, nicht http oder https.
4. Zusammenfassung
Anhand der obigen Einführung können wir feststellen, dass es sehr einfach ist, den Nginx-Reverse-Proxy-Websocket in ThinkPHP6 zu verwenden. Sie müssen lediglich einige grundlegende Konfigurationen in Nginx durchführen und einen WebSocket-Server in Swoole starten, und Sie können WebSocket für die Kommunikation am Frontend verwenden. Wenn in tatsächlichen Anwendungen Probleme auftreten, können Sie diese mithilfe des obigen Codes beheben.
Das obige ist der detaillierte Inhalt vonVerwendung des Nginx-Reverse-Proxy-Websockets in ThinkPHP6. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!