2011-01-28 2 views
0

J'ai actuellement un problème où, lorsqu'un utilisateur se connecte, son objet utilisateur est stocké dans une variable de session de manière à être plus rapide qu'un appel de base de données à chaque fois. Le problème que j'ai est que si quelque chose se met à jour de leur côté (comme le nombre de points qu'ils ont), je n'ai aucun moyen de modifier cette variable de session, je ne peux que mettre à jour leur ligne dans la table.Variables de session PHP -> Accès à un autre identifiant unique

Existe-t-il un moyen pour php d'accéder à cette variable de session étant donné son identifiant unique au lieu de lire son cookie? Ou serait-il préférable de vérifier un drapeau dans la base de données, et si l'indicateur est défini, mettre à jour toutes les informations?

+1

Je ne comprends pas très bien ce que vous entendez par "sur leur fin". Voulez-vous dire que si certaines données utilisateur changent de façon asynchrone (pas en réponse à une action de l'utilisateur) alors vous voulez mettre à jour les données, mais ne pouvez pas écrire dans la session? –

+0

À droite, par exemple, l'utilisateur 1 crée un lien de référence, l'envoie à l'utilisateur 2. Lorsque l'utilisateur 2 accède à ce lien, je veux mettre à jour le nombre de points que l'utilisateur 1 a. Je peux le faire facilement avec un appel de base de données, mais il n'y a aucun moyen de mettre à jour les informations de session de l'utilisateur 1. – Nikhil

+0

avez-vous eu plus loin avec votre problème? – chelmertz

Répondre

2

Vous devez lire à partir d'un stora centralisé ge (contrairement aux sessions). Si vous le pouvez, vous devriez éviter les appels à la base de données.Utiliser le cache et mettre à jour le cache insert:

  • utilisateur 1 cache de contrôles pour utilisateur 2 « s le score
    • il est non-existant, de sorte que l'appel est transmis à db
    • le score est encore vide/0 pour une entrée dans le cache est écrit comme ceci: clé: « buts » 2 (identifiant unique qui est facile à comprendre), valeur: « 0 »
  • utilisateur 2 marque un but
    • le score pour utilisateur-2 est calculé en cochant la cache (qui est vide), puis vérifier la db (qui est vide/0): 0 est score
    • le nouveau score est 0 + 1 = 1
    • le nouveau score est inséré dans la base de données (pour la persistance), le cache avec les clés "objectifs-2" est enregistré avec les clés "objectifs-2" et la valeur "1"

nous avons terminé, nous allons essayer la boucle à nouveau:

  • utilisateur 1 cache vérifie pour utilisateur 2 score de, trouve "1"
  • l'utilisateur 1 vérifie à nouveau le cache pour l'utilisateur 2 le score de l'utilisateur, trouve "1"

Nous économisons base de données vraiment beaucoup Vivent les.

Certains moteurs possibles pour la mise en cache sont:

Si vous êtes sur l'hébergement partagé, ou incapable d'obtenir PHP compilé avec un bon moteur pour la mise en cache, writing to files pourrait faire le travail.

1

Ce que je suggère est de créer un objet personnalisé qui contiendra des données par exemple 5 minutes et qu'il sera rechargé. Il suffit de créer un objet qui va charger vos données de la session, si l'objet chargé est plus vieux que cinq minutes, il suffit de recharger les données.

  1. Charge objet
  2. variable Arrivée objet si (temps()) son plus de 5 min (ou en tout temps personnalisé) recharger les données
  3. Si les données rechargées variables de mise à jour dans l'objet à nouveau et l'enregistrer à la session

Je pense que cela peut résoudre votre problème

class MySession 
{ 
    public $Duration = 0; 
    public $Loaded = 0; 
    public static function Load() 
    { 
     $obj = null; 
     if(isset($_SESSION["my_session"])) 
     { 
      $obj = deserialize($_SESSION["my_session"]);    
      if((time()-$obj->Loaded)>$Duaration) 
        $obj = self::LoadObject(); 
     } 
     else { $obj = self::LoadObject(); } 
     $obj->Save(); 
     return $obj; 
    } 
    public function Save() 
    { 
     $_SESSION["my_session"] = serialize($this); 
    } 
    public static function LoadObject() 
    { 
     $obj = new MySession(); 
     $obj->Loaded = time(); 
     //logic for updating data 
     return $obj; 
    } 
} 
Questions connexes