2010-10-31 22 views
2

Je dois mettre en place un système pour limiter le nombre d'utilisateurs qui peuvent utiliser mon application simultanément. Je pense que la meilleure façon de procéder est de compter le nombre de sessions actuellement actives, puis de limiter cela en fonction de cela.Compter et limiter le nombre d'utilisateurs sur mon application

Comment puis-je compter le nombre de sessions actuellement actives. J'utilise memcached pour stocker mes sessions si cela fait une différence

+0

Les utilisateurs se connectent-ils avec un nom d'utilisateur? –

+0

C'est une application facebook donc ... non ... mais il y a une authentification donc ... je suppose que la réponse que vous cherchez est oui – Starlin

Répondre

1

Je pense que la meilleure façon est d'intercepter open, destroy et gc les callbacks de la session (en utilisant session_set_save_handler()) et augmenter/diminuer une valeur de comptage de session dans memcached. Quelque chose comme:

class Memcache_Save_Handler { 

    private $memcached; 

    public function open($save_path, $name) { 
     $session_count = (int)$this->memcached->get('session_count'); 
     $this->memcached->set('session_count', ++$session_count); 
     // rest of handling... 
    } 

    public function destroy($id) { 
     $session_count = (int)$this->memcached->get('session_count'); 
     $this->memcached->set('session_count', --$session_count);  
     // rest of handling... 
    } 

} 
+0

Ce serait une bonne solution ... mais je n'aurais aucun moyen de savoir quand une session est détruite ... Les utilisateurs ne se déconnecteront jamais ... leur session va juste expirer .... – Starlin

+0

Le 'gc' callback a été laissé en dehors de mon exemple, mais c'est probablement celui que vous recherchez. Il accepte la durée de vie maximale de la session en tant qu'argument. Vous pouvez ensuite comparer la durée de vie avec la date de modification de la session et appliquer le même principe si elle a expiré. Voir php.net/session_set_save_handler pour des exemples. – netcoder

+0

Je suppose que vous voulez dire quelque chose de similaire à http://uk3.php.net/session_set_save_handler#58071 Je suis confus cependant quant à l'endroit où ce gestionnaire de session va. Est-ce à inclure lors de la création de chaque session? Lorsque le garbage collector s'exécute, comment sait-il exécuter cette fonction? Désolé d'être un n00b - merci pour vos conseils utiles :) – Starlin

1

Je ne connais aucun moyen de compter toutes les sessions actives à un moment donné en PHP. J'ai toujours utilisé une base de données pour cela, où je stockerais l'adresse IP et la date actuelle (NOW() fonction SQL). Ensuite, je vous pouvez faire une requête comme ceci (syntaxe MySQL):

SELECT COUNT(*) as active_users 
FROM logged_users 
WHERE last_action > NOW() - INTERVAL 5 MINUTE; 

Vous pouvez choisir d'afficher la page ou interdire à l'utilisateur de voir le site.

+0

Comment dirais-je s'ils étaient encore actifs? sûrement cela ne me dit que quand ils ont été authentifiés ... – Starlin

+0

Notez la condition WHERE. Il s'agit de la dernière action, pas la première fois. –

+0

Mais cela signifierait que je devrais mettre à jour la base de données tout ce que l'utilisateur a fait quelque chose ... me semble inefficace. – Starlin

1

Peut être votre web-serveur peut limiter le nombre maximum de clients simultanés? (Mais cela peut affecter la récupération des images/autres contenus statiques)