Mit der kontinuierlichen Weiterentwicklung moderner Webanwendungen ist Echtzeitkommunikation zu einer der notwendigen Funktionen geworden. Die WebSocket-Technologie ist eine der beliebtesten Echtzeitkommunikationsmethoden, mit der eine dauerhafte bidirektionale Verbindung zwischen dem Server und dem Client hergestellt werden kann, um eine Echtzeitkommunikation zu erreichen.
ThinkPHP ist ein sehr beliebtes PHP-Framework. ThinkPHP 6 wird mit dem Swoole-Erweiterungspaket geliefert, was die Verwendung der WebSocket-Technologie sehr einfach macht. In diesem Artikel wird erläutert, wie Sie mit dem ThinkPHP 6-Framework eine WebSocket-Broadcast-Funktion implementieren.
Bevor Sie beginnen, müssen Sie die folgende Umgebung vorbereiten:
Zuerst müssen wir Folgendes tun erstellen ein neues Projekt:
composer create-project topthink/think my-project
Um die Verwendung von WebSocket zu erleichtern, müssen wir dann die Swoole-Erweiterung in die Datei composer.json
des Projekts einfügen: composer.json
文件中添加 Swoole 扩展:
"require": { "topthink/think-swoole": "^2.0", "swoole/swoole": "^4.7" }
完成后,运行以下命令进行安装:
composer install
接下来,我们需要创建一个控制器来处理 WebSocket 的请求。在 app/controller
目录下创建一个名为 Websocket.php
的文件,写入以下代码:
<?php declare(strict_types=1); namespace appcontroller; use thinkswooleWebsocket as SwooleWebsocket; use SwooleWebSocketFrame; class Websocket extends SwooleWebsocket { /** * 监听连接事件 * @param SwooleWebSocketServer $server * @param SwooleHttpRequest $request */ public function onOpen($server, $request) { } /** * 监听接收消息事件 * @param SwooleWebSocketServer $server * @param Frame $frame */ public function onMessage($server, Frame $frame) { } /** * 监听关闭事件 * @param SwooleWebSocketServer $server * @param int $fd */ public function onClose($server, $fd) { } }
在上面的代码中,我们继承了 thinkswooleWebsocket
类,并重写了其中的三个方法:
onOpen
方法用于监听连接事件;onMessage
方法用于监听接收消息事件;onClose
方法用于监听关闭事件。当前,这些方法并没有做任何事情,接下来我们将会在这些方法中添加 WebSocket 通信的逻辑。
在控制器创建好之后,我们需要在路由中进行注册。在 app/route.php
文件中添加以下内容:
use thinkacadeRoute; Route::post('/ws', 'Websocket@onMessage')->middleware( hinkmiddlewareAllowCrossDomain::class);
这里使用了 Route::post
方法来注册路由。这个路由的请求方式是 POST
,路径为 /ws
,并将请求映射到了 Websocket
控制器的 onMessage
方法上。
现在,我们已经完成了 WebSocket 路由和控制器的创建与注册。接下来,我们需要在控制器中添加 WebSocket 通信的逻辑。我们将使用 Swoole 的 WebSocket 服务端来实现 WebSocket 通信。
在 onOpen
方法中,我们可以获取客户端的连接对象,并将其存储起来,以便后续使用。在 onMessage
方法中,我们可以获取客户端发送的消息,并将这条消息广播给其它客户端。在 onClose
方法中,我们需要将客户端从连接池中移除。
在 app/controller
目录下创建一个名为 WebSocketServer.php
的文件,写入以下代码:
<?php declare(strict_types=1); namespace appcontroller; use SwooleHttpResponse; use SwooleWebSocketFrame; use SwooleWebSocketServer; use thinkswoolewebsocketHandlerInterface; class WebSocketServer implements HandlerInterface { /** * @var array $connections */ private $connections = []; /** * 监听连接事件 * @param Server $server * @param SwooleHttpRequest $request */ public function onOpen(Server $server, SwooleHttpRequest $request): void { $this->connections[$request->fd] = $request->fd; echo "client-{$request->fd} is connected "; } /** * 监听消息事件 * @param Server $server * @param Frame $frame */ public function onMessage(Server $server, Frame $frame): void { foreach ($this->connections as $fd) { $info = $server->getClientInfo((int)$fd); if ($info && isset($info['websocket_status']) && $info['websocket_status'] == WEBSOCKET_STATUS_FRAME) { $server->push($fd, $frame->data); } else { unset($this->connections[$fd]); } } echo "received message from client-{$frame->fd}: {$frame->data} "; } /** * 监听关闭事件 * @param Server $server * @param int $fd * @param int $reactorId */ public function onClose(Server $server, int $fd, int $reactorId): void { unset($this->connections[$fd]); echo "client-{$fd} is closed "; } /** * @param Response $response */ public function onHandShake(Request $request, Response $response): bool { // Do nothing return true; } }
在写入 WebSocket 的服务代码之前,我们需要在 config
目录下创建一个名为 swoole.php
的配置文件,写入以下内容:
return [ 'socket_type' => 'websocket', 'host' => '0.0.0.0', 'port' => 9501, 'mode' => SWOOLE_PROCESS, 'sock_type' => SWOOLE_SOCK_TCP, 'settings' => [ 'worker_num' => swoole_cpu_num(), ], 'handler' => ppcontrollerWebSocketServer::class, ];
在上面的代码中,我们通过配置文件告诉应用程序如何启动 Swoole WebSocket 服务。我们启动 websocket
socket 类型,绑定在 0.0.0.0:9501
上,并开启了多进程模式,使用 TCP 协议。worker_num
配置项设置了服务器的进程数,这里使用了 swoole_cpu_num()
用于返回系统 CPU 数量;handler
配置项指定了我们在上文中创建的 WebSocketServer
类。
在完成了创建、配置 WebSocket 服务的代码之后,我们需要运行一下代码,来开启 WebSocket 服务。在命令行中执行以下命令即可:
php think swoole start --mode=websocket
Websocket 服务已经启动,你可以通过访问你的应用程序来测试它。你可以使用这个地址:ws://your-domain:9501/ws
rrreee
Websocket.php
im Verzeichnis app/controller
und schreiben Sie den folgenden Code: 🎜rrreee🎜Im obigen Code haben wir thinkswooleWebsocket
geerbt >-Klasse und überschreibt drei darin enthaltene Methoden: 🎜🎜🎜onOpen
-Methode wird zum Abhören von Verbindungsereignissen verwendet; 🎜🎜onMessage
-Methode wird zum Abhören von Empfangsnachrichtenereignissen verwendet; Die Methode 🎜🎜onClose
wird verwendet, um auf Abschlussereignisse zu warten. 🎜🎜🎜Derzeit bewirken diese Methoden nichts. Als Nächstes werden wir diesen Methoden die Logik der WebSocket-Kommunikation hinzufügen. 🎜🎜Route registrieren🎜🎜Nachdem der Controller erstellt wurde, müssen wir ihn in der Route registrieren. Fügen Sie den folgenden Inhalt in die Datei app/route.php
ein: 🎜rrreee🎜Die Methode Route::post
wird hier verwendet, um die Route zu registrieren. Die Anforderungsmethode dieser Route ist POST
, der Pfad ist /ws
und die Anforderung wird der onMessage
des Websocket zugeordnet
Controller > Methodisch. 🎜🎜WebSocket-Kommunikationslogik schreiben🎜🎜Jetzt haben wir die Erstellung und Registrierung von WebSocket-Routen und -Controllern abgeschlossen. Als nächstes müssen wir die Logik für die WebSocket-Kommunikation im Controller hinzufügen. Wir werden den WebSocket-Server von Swoole verwenden, um die WebSocket-Kommunikation zu implementieren. 🎜🎜In der Methode onOpen
können wir das Verbindungsobjekt des Clients abrufen und für die spätere Verwendung speichern. Mit der Methode onMessage
können wir die vom Client gesendete Nachricht abrufen und diese Nachricht an andere Clients senden. In der Methode onClose
müssen wir den Client aus dem Verbindungspool entfernen. 🎜🎜Erstellen Sie eine Datei mit dem Namen WebSocketServer.php
im Verzeichnis app/controller
und schreiben Sie den folgenden Code: 🎜rrreee🎜Konfigurieren Sie den WebSocket-Dienst.🎜🎜Schreiben Sie den WebSocket, bevor Sie ihn bereitstellen Code müssen wir eine Konfigurationsdatei mit dem Namen swoole.php
im Verzeichnis config
erstellen und den folgenden Inhalt schreiben: 🎜rrreee🎜Im obigen Code sagen wir der Anwendung, wie um den Swoole WebSocket-Dienst über die Konfigurationsdatei zu starten. Wir starten den Socket-Typ websocket
, binden ihn an 0.0.0.0:9501
und aktivieren den Multiprozessmodus mithilfe des TCP-Protokolls. Das Konfigurationselement worker_num
legt die Anzahl der Prozesse auf dem Server fest. swoole_cpu_num()
wird hier verwendet, um die Anzahl der System-CPUs zurückzugeben Das Konfigurationselement gibt unsere oben erstellte Klasse WebSocketServer
an. 🎜🎜Führen Sie den WebSocket-Dienst aus🎜🎜Nachdem wir den Code zum Erstellen und Konfigurieren des WebSocket-Dienstes fertiggestellt haben, müssen wir den Code ausführen, um den WebSocket-Dienst zu starten. Führen Sie einfach den folgenden Befehl in der Befehlszeile aus: 🎜rrreee🎜Der Websocket-Dienst wurde gestartet und Sie können ihn testen, indem Sie auf Ihre Anwendung zugreifen. Sie können diese Adresse verwenden: ws://your-domain:9501/ws
. Öffnen Sie mehrere Registerkarten im Browser, um die WebSocket-Verbindung sowie die Funktionen zum Senden und Empfangen von Nachrichten zu testen. 🎜🎜Zusammenfassung🎜🎜In diesem Artikel wird erläutert, wie Sie mit dem ThinkPHP 6-Framework eine WebSocket-Broadcast-Funktion implementieren. Dies erreichen wir, indem wir Controller erstellen, Routen registrieren, WebSocket-Kommunikationslogik schreiben und den WebSocket-Dienst konfigurieren. Dieses Beispiel kann als einfache Best Practice für WebSocket verwendet werden und bietet uns eine Referenz für die Entwicklung erweiterter WebSocket-Funktionen. 🎜Das obige ist der detaillierte Inhalt vonImplementierung von Websocket-Broadcast mit ThinkPHP6. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!