JeuWeb - Crée ton jeu par navigateur
[Résolu] Sessions PHP et deconnexion utilisateur - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [Résolu] Sessions PHP et deconnexion utilisateur (/showthread.php?tid=7636)



[Résolu] Sessions PHP et deconnexion utilisateur - didawin - 29-04-2016

Bonjour à tous,

J'en appelle à vos connaissance sur les sessions PHP.
Lorsqu'un utilisateur se log sur mon jeu, j'ouvre une session, s'il appuie sur déconnexion, j'appelle session_destroy et supprime les cookies associés.
Afin de pouvoir tracer tout ça, j'ai une table d'historique dans ma BDD ainsi que flag sur le joueur qui me permet de savoir s'il est actuellement connecté ou non.
Jusque là tout vas bien et ça fonctionne, le problème se pose si le joueur quitte le jeu sans se déconnecter (fermeture du navigateur, du pc, connexion interrompue, autre ....).
La solution serais de définir un délai d'inactivité, cependant je ne sait pas comment faire ça... Je sait bien que c'est à implémenter côté serveur mais je ne vois pas comment ?

Une autre possibilité serait de mettre un message de confirmation lors de l'appuie sur la croix du navigateur est si c'est ok, rediriger vers la page de déco puis fermer la page .. est-ce une bonne solution d'après vous ?

Merci d'avance pour votre aide.


RE: Sessions PHP et deconnexion utilisateur - xanthius - 29-04-2016

Pourquoi ne pas assigner une durée à la session et la vérifier à chaque fois ? Si tu constates que le joueur a dépassé la la durée limite il est automatiquement déconnecté


RE: Sessions PHP et deconnexion utilisateur - Xenos - 29-04-2016

id_joueur INT | session_hash BINARY | last_activity DATETIME

Et tu INSERT ON DUPLICATE KEY UPDATE dans cette table le n° du joueur, le HASH de sa session (ben oui, le n° de session, c'est un mot de passe, temporaire, et stocké en clair, ce n'est pas très propre) ainsi que NOW()
Après, tu n'as plus qu'à récupérer les lignes de cette tables "suffisamment récentes" (à toi de choisir un délais cohérent avec le jeu: 5 min? 15 min? etc) pour savoir qui est connecté.

Oublie le message sur la croix du navigateur, c'est de la merde ergonomique en barre.

La durée de péremption de la session ne changera rien car il s'agit de session PHP, gérées par PHP: si le mec n'est pas connecté, la session n'expirera pas toute seule (et même si elle expire, aka si le fichier des données de la session était supprimé, tu n'as pas de notification pour le sauver en BDD).


RE: Sessions PHP et deconnexion utilisateur - didawin - 29-04-2016

(29-04-2016, 03:08 PM)Xenos a écrit : id_joueur INT | session_hash BINARY | last_activity DATETIME

Et tu INSERT ON DUPLICATE KEY UPDATE dans cette table le n° du joueur, le HASH de sa session (ben oui, le n° de session, c'est un mot de passe, temporaire, et stocké en clair, ce n'est pas très propre) ainsi que NOW()
Après, tu n'as plus qu'à récupérer les lignes de cette tables "suffisamment récentes" (à toi de choisir un délais cohérent avec le jeu: 5 min? 15 min? etc) pour savoir qui est connecté.

Oublie le message sur la croix du navigateur, c'est de la merde ergonomique en barre.

La durée de péremption de la session ne changera rien car il s'agit de session PHP, gérées par PHP: si le mec n'est pas connecté, la session n'expirera pas toute seule (et même si elle expire, aka si le fichier des données de la session était supprimé, tu n'as pas de notification pour le sauver en BDD).

Je pense avoir compris, ce que tu veux dire, c'est que pour savoir le nombre de connectés sur mon portail, je ne vais pas chercher à mettre un flag "connecté"/"pas connecté" à chaque fois que quelqu'un se connecte déconnecte.
Ce que tu me dit c'est que je devrais inscrire dans ma BDD la date actuelle, chaque fois que l'utilisateur effectue une action ?
Ainsi, si je veux savoir le nombre de personne en ligne je n'ai qu'à récupéré le count des utilisateur avec une date actuelle - date en bdd < 15 minutes par exemple ? (signifie le nombre de joueur ayant fait une action il y as moins de 5 minutes) ?
mais n'est-ce pas coûteux pour la BDD de subir pour chaque joueur, pour chaque action un UPDATE ?


RE: Sessions PHP et deconnexion utilisateur - Xenos - 29-04-2016

Heu, non, je ne pensais pas stocker tous les évènements en BDD (ce serait possible mais effectivement lourd). Simplement, pourquoi ne pas remplacer ton booléen "connecté / pas connecté" par un datetime "dernière activité"? Et considérer "NOW() - dernière activité > 15minutes → joueur présent" ?

(la table que je te présente utilise ce système pour stocker la dernière activité des sessions PHP des joueurs, ce que j'avais cru être ta structure, tu peux reprendre le même principe avec id_joueur (INT) | ... tes colonnes actuelles ... | date_activite (DATETIME))

PS: tu peux même utiliser une colonne virtuelle "est actif", qui fait le calcul "NOW() - dernière activité", ou une vue (mais ce sont deux techniques un peu plus poussées, t'es pas obligé de plonger dedans direct).


RE: Sessions PHP et deconnexion utilisateur - didawin - 29-04-2016

(29-04-2016, 03:31 PM)Xenos a écrit : Heu, non, je ne pensais pas stocker tous les évènements en BDD (ce serait possible mais effectivement lourd). Simplement, pourquoi ne pas remplacer ton booléen "connecté / pas connecté" par un datetime "dernière activité"? Et considérer "NOW() - dernière activité > 15minutes → joueur présent" ?

(la table que je te présente utilise ce système pour stocker la dernière activité des sessions PHP des joueurs, ce que j'avais cru être ta structure, tu peux reprendre le même principe avec id_joueur (INT) | ... tes colonnes actuelles ... | date_activite (DATETIME))

PS: tu peux même utiliser une colonne virtuelle "est actif", qui fait le calcul "NOW() - dernière activité", ou une vue (mais ce sont deux techniques un peu plus poussées, t'es pas obligé de plonger dedans direct).

Mais le soucis (à moins que je n'ai toujours pas compris Sad ) c'est que si je me connecte, je remplie "dernière activité" par NOW().
Pendant 15 minutes je suis considéré comme non connecté, puis je rentre dans la condition "NOW() - dernière activité > 15minutes".
Puis je quitte le navigateur sans me déconnecter. Dans une heure, un mois, un an, etc.... la condition "NOW() - dernière activité > 15minutes" seras toujours vrai..
ne serait-ce pas plutôt "(NOW() - dernière activité) < 15minutes → joueur présent" ?

EDIT: Encore que là il y aurais un soucis quand même... si je me connecte pendant 15 minutes je suis considéré comme connecté, mais même si je joue toujours au bout de 30 minutes, je ne suis plus considéré comme connecté :/


RE: Sessions PHP et deconnexion utilisateur - Xenos - 29-04-2016

Non, c'est l'inverse: pendant 15 minutes, je suis considéré comme connecté car NOW - dernière activité < 15 minutes (j'ai peut-etre érit trop vite sur les posts d'avant). Et à chaque activité (chaque page ou chaque requête reçue par le serveur), cette date d'activité est mise à jour (cette 2nde phrase répond à ton soucis de "si je joue 30 minutes": si tu joues 30 minutes et fait des actions, la date de dernière activité sera mise à jour: ce n'est pas la date de dernière connexion, mais de dernière activité).


RE: Sessions PHP et deconnexion utilisateur - didawin - 29-04-2016

(29-04-2016, 04:16 PM)Xenos a écrit : Non, c'est l'inverse: pendant 15 minutes, je suis considéré comme connecté car NOW - dernière activité < 15 minutes (j'ai peut-etre érit trop vite sur les posts d'avant). Et à chaque activité (chaque page ou chaque requête reçue par le serveur), cette date d'activité est mise à jour (cette 2nde phrase répond à ton soucis de "si je joue 30 minutes": si tu joues 30 minutes et fait des actions, la date de dernière activité sera mise à jour: ce n'est pas la date de dernière connexion, mais de dernière activité).

D'accord merci ! c'est cette partie qu'il me manqué :
"(chaque page ou chaque requête reçue par le serveur), cette date d'activité est mise à jour"
EDIT-> Sur chaque page, je fait appel à une fonction que j'ai créée (login-check) qui vérifie que le joueur est connecté avant d'afficher la page, je vais donc ajouter l'update si le joueur est connecté suite à la réponse de cette fonction. J'avais oublié que je faisait cette opération sur chaque page ... :$

Maintenant je comprend Smile Merci à tous de votre aide, je met le topic en résolu.