Maison  >  Article  >  cadre php  >  Utilisation du Websocket du proxy inverse Nginx dans ThinkPHP6

Utilisation du Websocket du proxy inverse Nginx dans ThinkPHP6

WBOY
WBOYoriginal
2023-06-20 21:31:401750parcourir

Ces dernières années, Websocket est devenu un protocole de communication très important dans les applications Internet. ThinkPHP6, en tant qu'excellent framework de développement PHP, prend également en charge Websocket. Cependant, lors de l'utilisation de Websocket, nous impliquons généralement des problèmes tels que l'équilibrage entre domaines et la charge. Par conséquent, dans cet article, nous présenterons comment utiliser Websocket du proxy inverse Nginx dans ThinkPHP6.

Tout d'abord, nous devons clarifier les principes de base et les méthodes de mise en œuvre de Websocket. Websocket utilise le processus d'établissement de liaison du protocole HTTP pour établir une connexion. Une fois la connexion établie, le protocole TCP est utilisé pour la transmission réelle des données. Par conséquent, pour l’utilisation de Websocket, nous devons considérer à la fois les parties HTTP et TCP.

Dans les applications pratiques, nous utilisons généralement le proxy inverse Nginx pour l'équilibrage de charge Websocket et le traitement inter-domaines. Voyons comment utiliser Websocket de proxy inverse Nginx dans ThinkPHP6.

1. Configuration Nginx

Nous pouvons implémenter le proxy inverse pour Websocket via le fichier de configuration Nginx. Tout d'abord, nous devons déclarer un amont dans le bloc http :

http {
    upstream websocket_servers {
        server 127.0.0.1:8000;
        server 127.0.0.1:8001;
    }
}

Dans la configuration ci-dessus, nous avons déclaré un amont nommé websocket_servers, qui contient deux adresses de serveur. De cette façon, lorsque le client demande Websocket, Nginx transmettra la demande à l'un des serveurs selon l'algorithme d'équilibrage de charge.

Ensuite, ajoutez la configuration suivante dans le bloc serveur :

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;
    }
}

La configuration ci-dessus écoutera le port 80 et divisera la requête en deux situations. Lorsque le client demandera /ws, il sera transmis aux websocket_servers déclarés ci-dessus ; les autres demandes seront transmises au backend_server.

Pour les requêtes Websocket, nous devons définir des en-têtes de requête spéciaux, tels que Mise à niveau et Connexion. Ici, nous définissons ces en-têtes de requête via proxy_set_header. Notez que proxy_pass ici doit être le protocole http, pas le protocole https.

2. Configuration ThinkPHP6

Dans ThinkPHP6, nous devons démarrer le service Websocket via Swoole Server. Nous pouvons démarrer un simple service Websocket via le code suivant :

<?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();

Dans le code ci-dessus, nous avons créé un serveur WebSocket et écouté le port 8000. Lors de l'événement ouvert, nous recevrons une demande de connexion du client et lui enverrons un message de bienvenue. Dans l'événement de message, nous recevons le message envoyé par le client et répondons par un message. (Le message de réponse ici n'est qu'un exemple simple et doit être modifié en fonction des besoins réels des applications réelles.)

Il convient de noter ici que lors de l'utilisation du Websocket du proxy inverse Nginx, nous devons modifier le Le serveur WebSocket se lie au port sous le protocole TCP, pas au port sous le protocole HTTP. Par conséquent, nous devons définir le 3ème paramètre sur SWOOLE_SOCK_TCP.

Nous pouvons également utiliser le mode multi-processus de Swoole pour améliorer les performances. Dans le 4ème paramètre, nous pouvons le définir sur SWOOLE_PROCESS et spécifier un nombre pour représenter le nombre de processus.

Dans les applications réelles, nous devrons peut-être utiliser certaines fonctions de base de données ou de cache dans le service Websocket, ce qui peut être facilement réalisé grâce à la fonction d'injection de dépendances de ThinkPHP6.

3. Code front-end

Enfin, regardons comment le code front-end utilise Websocket.

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");
};

Dans le code ci-dessus, nous communiquons avec le serveur via l'objet WebSocket. Lorsqu'une connexion est ouverte, l'événement onopen est déclenché, lorsqu'un message est reçu, l'événement onmessage est déclenché et lorsque la connexion est fermée, l'événement onclose est déclenché.

Il est à noter que le protocole ici doit être ws, et non http ou https.

4. Résumé

Grâce à l'introduction ci-dessus, nous pouvons constater que l'utilisation du Websocket de proxy inverse Nginx dans ThinkPHP6 est une chose très simple. Il vous suffit d'effectuer une configuration de base dans Nginx et de démarrer un serveur WebSocket dans Swoole, et vous pouvez utiliser WebSocket pour communiquer sur le front-end. Si vous rencontrez des problèmes dans des applications réelles, vous pouvez vous référer au code ci-dessus pour les résoudre.

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