Cerrar conexiones no autenticadas

Problema:

¿Cómo cerrar clientes que no han enviado datos dentro de un tiempo determinado,
por ejemplo, si no se recibe ningún dato en 30 segundos, cerrar automáticamente esa conexión de cliente?
El objetivo es obligar a las conexiones no autenticadas a autenticarse dentro del tiempo especificado.

Respuesta:

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)
{
    // Temporalmente agrega un atributo auth_timer_id al objeto $connection para almacenar el id del temporizador
    // Cierra la conexión después de 30 segundos, necesita que el cliente envíe la verificación para eliminar el temporizador dentro de 30 segundos
    $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':
        ...略
        // Si la verificación tiene éxito, elimina el temporizador para evitar que se cierre la conexión
        Timer::del($connection->auth_timer_id);
        break;
         ... 略
    }
    ... 略
}