2013-09-23 1 views
0

Je développe un site en PHP. Lorsque la session utilisateur démarre, je charge toute sa ligne db dans la variable $ _SESSION. Lorsque l'utilisateur change une valeur db, je mets aussi à jour la variable $ _SESSION.Cohérence des données utilisateur entre toutes ses sessions

Le problème commence lorsque plusieurs sessions sont actives pour le même utilisateur. Existe-t-il un moyen de mettre à jour les données pour toutes les sessions du même utilisateur sans surcharger la base de données? Ou, alternativement, y a-t-il un moyen de forcer php à utiliser le même fichier de session pour toute la session appartenant au même utilisateur? Ou je dois simplement interroger la base de données chaque fois qu'une session se poursuit?

Et un autre dilemme: est-ce que ça vaut le coup? Je veux dire, je ne sais pas combien ce mécanisme pourrait alléger la charge du serveur, et je ne sais pas si ce mécanisme est applicable aux sessions basées sur des fichiers ou je dois utiliser un autre type de stockage de session.

Cette question est en quelque sorte liée à this other question on mine (même si la solution consiste simplement à supprimer tous les fichiers de session).

+1

Si les données sont présentes dans la base de données, vous n'avez pas besoin de les transférer par session à chaque fois. Vous n'avez besoin que de l'utilisateur connecté enregistré en session. Disons que l'utilisateur est connecté, et il met à jour son avatar ou quelque chose, lié à son user_id. Pourquoi auriez-vous besoin d'enregistrer $ row ['avatar'] dans $ _SESSION, quand vous pouvez y accéder à chaque fois par '" SELECT utilisateurs avatar FROM WHERE user_id = $ _SESSION ['user_id'] "' –

+0

@RoyalBg Vous enregistrez exactement votre donné appelez à la base de données, si vous gardez ces données dans la lecture de toute façon SESSION – djot

+0

exactement @RoyalBg, vous devez mettre à jour evrything dans db en utilisant le 'user_id', puis si vous devez mettre à jour email ou nom d'utilisateur, puis le mettre à jour enregistrer l'e-mail ou le nom d'utilisateur mis à jour à la session –

Répondre

1

Il atteint vraiment la question pourquoi auriez-vous besoin de beaucoup de données dans un $ _SESSION. Et vous devriez vraiment prendre le temps de décider quelles données sont si souvent nécessaires pour être affichées.

Dans la plupart des cas, vous n'avez besoin que d'un identifiant de session qui permet à l'utilisateur connecté, contenant user_id, de prendre les données nécessaires directement à partir de la base de données.

En supposant que l'utilisateur peut changer son avatar, et ne vont pas tellement d'endroits pour afficher cet avatar, vous n'avez pas besoin de le stocker en session, ni à SELECT ce au même moment. Par exemple, vous pouvez avoir une page de déclenchement, qui SELECTS l'avatar par $_SESSION['user_id'] lorsqu'il essaie d'envoyer un message personnel à un autre utilisateur. Sinon, vous pouvez mettre un cache (c'est-à-dire en utilisant memcached) où une requête, qui sélectionne les avatars utilisateur, ne doit pas être effectuée plus d'une fois par heure.

Si l'utilisateur change un email, c'est la même chose. Si quelqu'un d'autre essaie de lui envoyer un message, vous déclenchez la requête SELECT. Sinon, un cache est défini. Donc, disons que l'utilisateur a changé d'avatar, d'email, d'autres informations triviales, puis a accédé à votre page d'index. Dans sa session, vous chargez uniquement l'identifiant. Dans la base de données, les enregistrements sont présents, mais ils ne sont pas encore sélectionnés. Vous n'avez donc aucune charge de serveur, car la session est légère, ni la charge de base de données, car aucune requête SELECT n'a été envoyée.

Peu importe combien de fois l'utilisateur essaie de définir sa session (dans ce cas, il se connecte une deuxième fois), vous avez une donnée présente dans la base de données, et une session uniquement avec identificateur. Vous pouvez identifier toutes ses instances, mais n'utilisez jamais de données, ce qui n'est pas nécessaire.

+0

Merci, memcached sera parfait :) À propos de la sélection de colonnes, il n'est pas préférable de charger la ligne entière une seule fois? –

0

1 Eh bien, je (ne pas, mais) pourrait le faire avec mon gestionnaire de session. J'utilise SESSIONS avec des informations supplémentaires/colonnes comme nom d'utilisateur et ID utilisateur. De cette façon, je peux déterminer exactement quelle session appartient à quel utilisateur sans manipuler les données sérialisées.

http://php.net/manual/de/function.session-set-save-handler.php

2 Mais dans votre cas, il est peut-être plus simple de mettre à jour votre table d'utilisateur, puis sélectionner à nouveau l'utilisateur de mettre les (nouvelles) données à $ _SESSION [ « user »]. (Vous aurez besoin de certaines informations "données utilisateur mises à jour" pour recharger de nouvelles données pour toutes les sessions).

3 Ou vous évitez simplement qu'un utilisateur puisse se connecter plus d'une fois.

+0

La recherche des données à chaque fois est évidemment beaucoup plus simple :) mais ce n'est pas un problème. Mon vrai problème est de savoir si un mécanisme comme celui-ci est vraiment efficace ... J'ai mis à jour ma question, voir «l'autre dilemme». –

+0

Avez-vous vraiment besoin d'une telle fonctionnalité? J'ai le sentiment que votre "concept" est faux. – djot

Questions connexes