Fermer les connexions non authentifiées

Problème :

Comment fermer les clients qui n'ont pas envoyé de données dans un délai spécifié, par exemple, si aucune donnée n'est reçue dans les 30 secondes, la connexion de ce client doit être automatiquement fermée. L'objectif est d'exiger que les connexions non authentifiées s'authentifient dans le délai imparti.

Réponse :

use Workerman\Worker;
use Workerman\Timer;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';

$worker = new Worker('xxx://x.x.x.x:x');
$worker->onConnect = function(TcpConnection $connection)
{
    // Ajoute temporairement une propriété auth_timer_id à l'objet $connection pour stocker l'ID du minuteur
    // Ferme la connexion après 30 secondes, nécessite que le client envoie une authentification dans les 30 secondes pour supprimer le minuteur
    $connection->auth_timer_id = Timer::add(30, function()use($connection){
        $connection->close();
    }, null, false);
};
$worker->onMessage = function(TcpConnection $connection, $msg)
{
    $msg = json_decode($msg, true);
    switch($msg['type'])
    {
    case 'login':
        ...略
        // Authentification réussie, supprime le minuteur pour éviter que la connexion ne soit fermée
        Timer::del($connection->auth_timer_id);
        break;
         ... 略
    }
    ... 略
}