Heim  >  Artikel  >  PHP-Framework  >  Implementierung von Websocket-Broadcast mit ThinkPHP6

Implementierung von Websocket-Broadcast mit ThinkPHP6

WBOY
WBOYOriginal
2023-06-20 08:41:341637Durchsuche

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.

Umgebungsanforderungen

Bevor Sie beginnen, müssen Sie die folgende Umgebung vorbereiten:

  • PHP 7.2+
  • Swoole-Erweiterung
  • Composer
  • Grundkenntnisse in der Webentwicklung

Projekt erstellen

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 thinkacadeRoute;

Route::post('/ws', 'Websocket@onMessage')->middleware(    hinkmiddlewareAllowCrossDomain::class);

这里使用了 Route::post 方法来注册路由。这个路由的请求方式是 POST,路径为 /ws,并将请求映射到了 Websocket 控制器的 onMessage 方法上。

编写 WebSocket 通信逻辑

现在,我们已经完成了 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 服务

在写入 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 服务的代码之后,我们需要运行一下代码,来开启 WebSocket 服务。在命令行中执行以下命令即可:

php think swoole start --mode=websocket

Websocket 服务已经启动,你可以通过访问你的应用程序来测试它。你可以使用这个地址:ws://your-domain:9501/wsrrreee

Führen Sie nach Abschluss den folgenden Befehl aus Zum Installieren:

rrreee

Kontroll-Controller erstellen

Als nächstes müssen wir einen Controller erstellen, um WebSocket-Anfragen zu verarbeiten. Erstellen Sie eine Datei mit dem Namen Websocket.php im Verzeichnis app/controller und schreiben Sie den folgenden Code: 🎜rrreee🎜Im obigen Code haben wir thinkswooleWebsocketgeerbt >-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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn