Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment limiter les tentatives de connexion - PHP &MySQL &CodeIgniter

J'ai implémenté un mécanisme de limitation du pauvre dans phunction en utilisant APC seul, voici comment je l'utilise :

// allow 60 requests every 30 seconds
// each request counts as 1 (expensive operations can use higher values)
// keep track of IPs by REMOTE_ADDR (ignore others)

$throttle = ph()->Throttle($ttl = 30, $exit = 60, $count = 1, $proxy = false);

if ($throttle === true)
{
    // IP exceded 30 requests in the last 60 seconds, die() here
}

else
{
    // $throttle is a float
    // number of requests in the last 30 seconds / 30 seconds

    /*
     1 req / 30 = 0,033 sec
     5 req / 30 = 0,166 sec
    10 req / 30 = 0,333 sec
    15 req / 30 = 0,5   sec
    20 req / 30 = 0,666 sec
    25 req / 30 = 0,833 sec
    30 req / 30 = 1     sec
    */

    usleep(intval(floatval($throttle) * 1000000));
}

Je l'utilise sur mon Front-Controller et je transmets la valeur à ma méthode de routage, mais c'est une autre histoire.

L'essentiel est que si vous utilisez APC, vous pouvez garder les choses très rapidement en mémoire et avec peu de consommation de mémoire car APC suit une méthodologie FILO. Si vous avez besoin de délais d'attente bien plus longs, vous pouvez envisager d'utiliser quelque chose qui n'est pas basé sur la mémoire.

BTW :MySQL prend en charge les tables avec le moteur MEMORY.

Le problème avec sleep() :

Un serveur Web Apache typique avec PHP installé en tant que module consommera environ 10 Mo de RAM par instance. Pour éviter de dépasser votre RAM disponible, vous pouvez configurer certains paramètres Apache pour limiter le nombre maximal d'instances qu'Apache peut démarrer.

Le problème est lorsque vous sleep() , cette instance est toujours active et avec suffisamment de requêtes, elle pourrait finir par consommer tous les emplacements disponibles pour démarrer de nouveaux serveurs, rendant ainsi votre site Web inaccessible jusqu'à ce que certaines requêtes en attente soient terminées.

Il n'y a aucun moyen de surmonter cela à partir de PHP AFAIK, donc en fin de compte, c'est à vous de décider.

Le principe est le même pour la limitation à l'échelle du système :

function systemWide($ttl = 86400, $exit = 360)
{
    if (extension_loaded('apc') === true)
    {
        $key = array(__FUNCTION__);

        if (apc_exists(__FUNCTION__) !== true)
        {
            apc_store(__FUNCTION__, 0, $ttl);
        }

        $result = apc_inc(__FUNCTION__, 1);

        if ($result < $exit)
        {
            return ($result / $ttl);
        }

        return true;
    }

    return false;
}