Maison  >  Article  >  cadre php  >  Implémentation de la diffusion Websocket à l'aide de ThinkPHP6

Implémentation de la diffusion Websocket à l'aide de ThinkPHP6

WBOY
WBOYoriginal
2023-06-20 08:41:341685parcourir

Avec le développement continu des applications Web modernes, la communication en temps réel est devenue l'une des fonctions nécessaires. La technologie WebSocket est l'une des méthodes de communication en temps réel les plus populaires, permettant d'établir une connexion bidirectionnelle persistante entre le serveur et le client pour établir une communication en temps réel.

ThinkPHP est un framework PHP très populaire. ThinkPHP 6 est livré avec le package d'extension Swoole, ce qui rend très simple l'utilisation de la technologie WebSocket. Cet article explique comment utiliser le framework ThinkPHP 6 pour implémenter une fonction de diffusion WebSocket.

Exigences en matière d'environnement

Avant de commencer, vous devez préparer l'environnement suivant :

  • PHP 7.2+
  • Extension Swoole
  • Composer
  • Connaissances de base en développement Web

Créer un projet

Tout d'abord, nous devons créer un nouveau projet :

composer create-project topthink/think my-project

Ensuite, afin de faciliter l'utilisation de WebSocket, nous devons ajouter l'extension Swoole dans le fichier composer.json du projet : 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

Une fois terminé, exécutez la commande suivante pour installer :

rrreee

Créer un contrôleur de contrôle

Ensuite, nous devons créer un contrôleur pour gérer les requêtes WebSocket. Créez un fichier nommé Websocket.php dans le répertoire app/controller et écrivez le code suivant : 🎜rrreee🎜Dans le code ci-dessus, nous avons hérité de thinkswooleWebsocket classe, et y remplace trois méthodes : 🎜🎜🎜La méthode onOpen est utilisée pour écouter les événements de connexion ; 🎜🎜La méthode onMessage est utilisée pour écouter l'événement de réception de message ; 🎜🎜La méthode onClose est utilisée pour écouter les événements de fermeture. 🎜🎜🎜Actuellement, ces méthodes ne font rien. Ensuite, nous ajouterons la logique de communication WebSocket à ces méthodes. 🎜🎜Enregistrer l'itinéraire🎜🎜Une fois le contrôleur créé, nous devons l'enregistrer dans l'itinéraire. Ajoutez le contenu suivant dans le fichier app/route.php : 🎜rrreee🎜La méthode Route::post est utilisée ici pour enregistrer l'itinéraire. La méthode de requête de cette route est POST, le chemin est /ws et la requête est mappée au onMessage du Websocket contrôleur > Méthodologiquement. 🎜🎜Écriture de la logique de communication WebSocket🎜🎜Maintenant, nous avons terminé la création et l'enregistrement des routes et des contrôleurs WebSocket. Ensuite, nous devons ajouter la logique de communication WebSocket dans le contrôleur. Nous utiliserons le serveur WebSocket de Swoole pour implémenter la communication WebSocket. 🎜🎜Dans la méthode onOpen, nous pouvons obtenir l'objet de connexion du client et le stocker pour une utilisation ultérieure. Dans la méthode onMessage, nous pouvons récupérer le message envoyé par le client et diffuser ce message aux autres clients. Dans la méthode onClose, nous devons supprimer le client du pool de connexions. 🎜🎜Créez un fichier nommé WebSocketServer.php dans le répertoire app/controller et écrivez le code suivant : 🎜rrreee🎜Configurez le service WebSocket🎜🎜Écrivez le WebSocket Avant de servir le code, nous devons créer un fichier de configuration nommé swoole.php dans le répertoire config et écrire le contenu suivant : 🎜rrreee🎜Dans le code ci-dessus, nous indiquons à l'application comment pour démarrer le service Swoole WebSocket via le fichier de configuration. Nous démarrons le type de socket websocket, le lions à 0.0.0.0:9501 et activons le mode multi-processus, en utilisant le protocole TCP. L'élément de configuration worker_num définit le nombre de processus sur le serveur. swoole_cpu_num() est utilisé ici pour renvoyer le nombre de processeurs système ; L'élément de configuration spécifie notre classe WebSocketServer créée ci-dessus. 🎜🎜Exécuter le service WebSocket🎜🎜Après avoir terminé le code pour créer et configurer le service WebSocket, nous devons exécuter le code pour démarrer le service WebSocket. Exécutez simplement la commande suivante sur la ligne de commande : 🎜rrreee🎜Le service Websocket a été démarré et vous pouvez le tester en accédant à votre application. Vous pouvez utiliser cette adresse : ws://votre-domaine:9501/ws. Ouvrez plusieurs onglets dans le navigateur pour tester respectivement la connexion WebSocket, les fonctions d'envoi et de réception de messages. 🎜🎜Résumé🎜🎜Cet article présente comment utiliser le framework ThinkPHP 6 pour implémenter une fonction de diffusion WebSocket. Nous y parvenons en créant des contrôleurs, en enregistrant les routes, en écrivant la logique de communication WebSocket et en configurant le service WebSocket. Cet exemple peut être utilisé comme une simple bonne pratique WebSocket et nous fournit une référence pour développer des fonctions WebSocket plus avancées. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn