Maison  >  Article  >  cadre php  >  Comment implémenter une connexion longue TCP dans Swoole

Comment implémenter une connexion longue TCP dans Swoole

WBOY
WBOYoriginal
2023-06-25 18:35:251724parcourir

Avec le développement rapide d'Internet, l'application du protocole TCP est de plus en plus répandue, notamment dans les domaines des jeux en ligne, de la messagerie instantanée, des transactions financières, etc., une connexion longue TCP est indispensable. En tant que framework de communication réseau PHP haute performance, Swoole peut naturellement parfaitement prendre en charge les connexions longues TCP. Cet article explique comment implémenter les connexions longues TCP dans Swoole.

1. Connexion persistante TCP de Swoole

Dans Swoole, la connexion persistante TCP signifie qu'une fois que le client et le serveur ont établi une connexion réseau, le client peut effectuer plusieurs demandes et réponses via la connexion jusqu'à ce que le client ferme activement la connexion. la connexion est anormale. Par rapport aux connexions courtes, les connexions longues TCP peuvent réduire le nombre de négociations à trois voies et de quatre vagues TCP, réduire la latence du réseau et l'utilisation des ressources, et améliorer le débit et la stabilité du serveur. Par conséquent, elles sont largement utilisées dans les scénarios à forte concurrence. .

2. Étapes de mise en œuvre d'une connexion longue TCP

  1. Établir un serveur TCP

Dans Swoole, nous pouvons créer un serveur TCP via le code suivant :

$serv = new SwooleServer("127.0.0.1", 9501);

$serv->on('connect', function ($server, $fd) {
    echo "Client: Connect.
";
});

$serv->on('receive', function ($server, $fd, $from_id, $data) {
    $server->send($fd, "Server: ".$data);
});

$serv->on('close', function ($server, $fd) {
    echo "Client: Close.
";
});

$serv->start();

Dans le code ci-dessus, nous avons créé un serveur TCP à 127.0. 0.1 :9501 surveille le serveur TCP et enregistre trois fonctions de rappel d'événement : connecter, recevoir et fermer. Parmi eux, l'événement de connexion sera exécuté une fois que le client aura établi une connexion avec le serveur, l'événement de réception sera exécuté après que le serveur aura reçu le message de demande du client et l'événement de fermeture sera exécuté après que le client ferme activement la connexion ou le la connexion est anormalement déconnectée.

  1. Implémentation des connexions TCP longues

Pour les connexions TCP longues, basées sur le code ci-dessus, il suffit d'ajouter une variable pour stocker la connexion client dans l'événement connect :

$serv = new SwooleServer("127.0.0.1", 9501);

// 存储客户端连接的变量
$connections = array();

$serv->on('connect', function ($server, $fd) use (&$connections) {
    echo "Client: Connect.
";
    $connections[$fd] = array(
        'fd' => $fd,
        'last_time' => time()
    );
});

$serv->on('receive', function ($server, $fd, $from_id, $data) {
    $server->send($fd, "Server: ".$data);
});

$serv->on('close', function ($server, $fd) use (&$connections) {
    echo "Client: Close.
";
    // 删除客户端连接
    unset($connections[$fd]);
});

$serv->start();

Dans le code ci-dessus, nous définissons A $ tableau de connexions pour stocker les connexions client Lorsqu'une nouvelle connexion est établie, nous stockons les informations de connexion dans le tableau et enregistrons l'heure de la dernière communication lorsque la connexion est fermée, nous supprimons les informations de connexion du tableau ;

De plus, afin d'éviter les déconnexions causées par une absence d'interaction de données pendant une longue période, nous pouvons utiliser une minuterie pour détecter de temps en temps une connexion sans communication pendant une longue période et la déconnecter :

$serv = new SwooleServer("127.0.0.1", 9501);

// 存储客户端连接的变量
$connections = array();

$serv->on('connect', function ($server, $fd) use (&$connections) {
    echo "Client: Connect.
";
    $connections[$fd] = array(
        'fd' => $fd,
        'last_time' => time()
    );
});

$serv->on('receive', function ($server, $fd, $from_id, $data) {
    $server->send($fd, "Server: ".$data);
    // 更新最后通信时间
    global $connections;
    $connections[$fd]['last_time'] = time();
});

$serv->on('close', function ($server, $fd) use (&$connections) {
    echo "Client: Close.
";
    // 删除客户端连接
    unset($connections[$fd]);
});

// 定时器,检测长时间没有通信的连接并断开
$serv->tick(1000, function() use (&$connections) {
    global $serv;
    $now = time();
    foreach($connections as $fd => $conn) {
        if ($now - $conn['last_time'] > 60) {
            $serv->close($fd);
            unset($connections[$fd]);
        }
    }
});

$serv->start();

Dans ce qui précède code, nous ajoutons Un minuteur est créé pour détecter le dernier temps de communication de toutes les connexions chaque seconde. S'il dépasse un certain temps (60 secondes dans cet exemple), la connexion est fermée et les informations de connexion sont supprimées du tableau $connections.

3. Résumé

Grâce aux étapes ci-dessus, nous pouvons implémenter une connexion longue TCP dans Swoole. Il convient de noter que dans le développement réel, la mise en œuvre de connexions longues doit être optimisée en fonction de conditions commerciales spécifiques, telles que la personnalisation des paquets de pulsation, la définition de délais d'attente, la surveillance de l'état de la connexion, etc., afin d'assurer la stabilité et la fiabilité des connexions longues. relations. J'espère que cet article pourra vous aider à implémenter des connexions TCP longues.

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