Maison  >  Article  >  cadre php  >  Comment utiliser Swoole pour créer un serveur WebSocket hautes performances

Comment utiliser Swoole pour créer un serveur WebSocket hautes performances

WBOY
WBOYoriginal
2023-06-13 23:59:201421parcourir

Ces dernières années, la technologie WebSocket est devenue de plus en plus populaire dans le développement Internet, notamment dans des domaines tels que la communication en temps réel, les jeux en ligne et les messages push. En tant qu'extension PHP asynchrone hautes performances, Swoole peut aider les développeurs à créer facilement des serveurs WebSocket hautes performances. Cet article explique comment utiliser Swoole pour créer un serveur WebSocket hautes performances.

1. Installez Swoole

Swoole prend en charge les versions PHP 5.3~7.4 et peut être installé via pecl ou le code source. Prenons l'exemple de l'installation du code source :

Téléchargez d'abord le package d'installation de Swoole, puis décompressez-le dans le répertoire et exécutez la commande suivante :

phpize
./configure
make
make install

Une fois l'installation terminée , ajoutez-le au php.ini L'élément de configuration suivant active l'extension Swoole :

extension=swoole

Une fois l'installation terminée, utilisez la commande php --ri swoole pour interroger le fichier de base informations de Swoole. php --ri swoole 命令可以查询 Swoole 的基本信息。

二、创建 WebSocket 服务器

下面我们来搭建一个简单的 WebSocket 服务器。首先在项目根目录下创建一个 server.php 文件,输入以下代码:

<?php
$server = new swoole_websocket_server("0.0.0.0", 9502);

$server->on("open", function (swoole_websocket_server $server, swoole_http_request $request) {
    echo "client {$request->fd} connected
";
});

$server->on("message", function (swoole_websocket_server $server, $frame) {
    echo "received message: {$frame->data}
";
});

$server->on("close", function (swoole_websocket_server $server, $fd) {
    echo "client {$fd} closed
";
});

$server->start();

以上代码中,我们首先创建了一个 swoole_websocket_server 实例,设置监听地址为 0.0.0.0,端口为 9502。然后分别监听了 open、message、close 三个事件,在客户端连接建立、接收到消息、连接关闭时分别触发相应的事件处理函数。

接下来在控制台运行以下命令启动 WebSocket 服务器:

php server.php

如果一切正常,可以看到类似以下输出:

2019-06-17 10:51:17|INFO|Server Start: 0.0.0.0:9502

三、测试 WebSocket 服务器

启动 WebSocket 服务器后,可以使用前端开发者常用的 WebSocket 插件工具,例如 Firefox 的 Simple WebSocket Client 插件 或 Chrome 的 WebSocket Client 插件 测试服务器是否正常工作。

以 Firefox Simple WebSocket Client 为例,打开插件后输入 ws://127.0.0.1:9502 点击 Connect 按钮即可。这时候我们会发现,在服务器端控制台输出了输出了 "client 1 connected" 日志,这说明 WebSocket 客户端已经成功连接了服务器。

我们可以在插件的发送区域输入测试内容,比如输入 "hello" 然后点击 send 按钮,就可以在控制台看到对应的 "received message: hello" 日志,说明服务器已经成功接收了 WebSocket 客户端发送的消息。

四、提高性能

在大流量场景下,WebSocket 服务器的性能是非常关键的。Swoole 提供了多种机制来提高 WebSocket 服务器的性能。

  1. 开启协程

通过在代码中调用 SwooleCoroutineun

2. Créez un serveur WebSocket

Construisons un serveur WebSocket simple. Créez d'abord un fichier server.php dans le répertoire racine du projet et entrez le code suivant :
    <?php
    use SwooleCoroutine;
    Coun(function () {
        $server = new swoole_websocket_server("0.0.0.0", 9502);
    
        $server->on("open", function (swoole_websocket_server $server, swoole_http_request $request) {
            echo "client {$request->fd} connected
    ";
        });
    
        $server->on("message", function (swoole_websocket_server $server, $frame) {
            echo "received message: {$frame->data}
    ";
        });
    
        $server->on("close", function (swoole_websocket_server $server, $fd) {
            echo "client {$fd} closed
    ";
        });
    
        $server->start();
    });
  1. Dans le code ci-dessus, nous avons d'abord créé une instance swoole_websocket_server et défini l'adresse d'écoute sur 0.0.0.0 et le port au 9502. Ensuite, les trois événements d'ouverture, de message et de fermeture sont surveillés respectivement, et les fonctions de traitement d'événements correspondantes sont déclenchées lorsque la connexion client est établie, qu'un message est reçu et que la connexion est fermée.
Exécutez ensuite la commande suivante dans la console pour démarrer le serveur WebSocket :

$server->set([
    'worker_num' => 4,   // 工作进程数量
]);

Si tout est normal, vous pouvez voir un résultat similaire à celui-ci :

$db = new SwooleCoroutineMySQL();
$db->connect([
    'host' => 'localhost',
    'port' => 3306,
    'user' => 'root',
    'password' => '',
    'database' => 'test',
]);

$res = $db->query('SELECT * FROM users WHERE id = 1');

三, Testez le serveur WebSocket
  1. Après avoir démarré le serveur WebSocket, vous pouvez utiliser les outils de plug-in WebSocket couramment utilisés par les développeurs front-end, tels que le plug-in Simple WebSocket Client de Firefox ou Le plug-in WebSocket Client de Chrome pour tester si le serveur fonctionne correctement.
Prenons l'exemple du client Firefox Simple WebSocket. Après avoir ouvert le plug-in, entrez ws://127.0.0.1:9502 et cliquez sur le bouton Connecter. À ce stade, nous constaterons que le journal « client 1 connecté » est affiché sur la console du serveur, ce qui indique que le client WebSocket s'est connecté avec succès au serveur.

Nous pouvons saisir le contenu du test dans la zone d'envoi du plug-in, par exemple, saisir "bonjour" et cliquer sur le bouton d'envoi. Vous pouvez voir le "message reçu : bonjour" correspondant. connectez-vous à la console, indiquant que le serveur a réussi. Reçu un message envoyé par le client WebSocket.

4. Améliorer les performances

Dans les scénarios de trafic important, les performances du serveur WebSocket sont très critiques. Swoole fournit plusieurs mécanismes pour améliorer les performances des serveurs WebSocket. #🎜🎜#
    #🎜🎜#Ouvrir la coroutine #🎜🎜##🎜🎜##🎜🎜# En appelant la fonction SwooleCoroutineun dans le code pour ouvrir la coroutine, plusieurs coroutines peuvent être activé L'exécution simultanée améliore le débit du serveur. #🎜🎜##🎜🎜#Par exemple, modifiez le code dans server.php : #🎜🎜#rrreee#🎜🎜##🎜🎜#Définissez le nombre de travailleurs #🎜🎜##🎜🎜##🎜🎜#Quand démarrage du serveur À ce stade, vous pouvez améliorer la capacité de traitement simultané du serveur en définissant le nombre de travailleurs. Le nombre de travailleurs peut être défini de la manière suivante : #🎜🎜#rrreee#🎜🎜#Sous la coroutine, le nombre de travailleurs doit être défini dans la fonction d'exécution. #🎜🎜##🎜🎜##🎜🎜#Utiliser MySQL asynchrone#🎜🎜##🎜🎜##🎜🎜#Si le serveur WebSocket doit faire fonctionner la base de données, vous pouvez utiliser le client MySQL asynchrone de Swoole pour éviter les erreurs causées par la base de données blocage des opérations, améliorant ainsi les performances du serveur. #🎜🎜##🎜🎜#Par exemple, l'exemple de code pour utiliser le client MySQL asynchrone Swoole pour obtenir un enregistrement est le suivant : #🎜🎜#rrreee#🎜🎜#Ce qui précède est le processus de base pour utiliser Swoole pour créer un serveur WebSocket hautes performances. En utilisant le support asynchrone, le multi-processus, la coroutine et d'autres avantages fournis par Swoole, les performances du serveur WebSocket peuvent être considérablement améliorées, rendant l'application plus stable et efficace. #🎜🎜#

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