Gestion session

Eléphant du PHP | 183 Messages

07 oct. 2015, 20:34

Salut à tous !
Je suis actuellement en train de faire un p'tit site, bref, je me pose une question, car j'ai du mal à trouvé une réponse bien expliquer, surtout adapter à ce cas.
Voilà , en fait j'ai un utilisateur qui se log ensuite il y a une page tchat, donc dans ma base donnée, j'ai le status_connexion et un status_chat 0 ou 1 pour les 2 suivant l'état du status donc, mais voila, si l'utilisateur ferme sont navigateur comme un bourrin ou si y a un session time out, les status reste inchangé dans la base de donnée ce qui posera des problèmes énormes pour la gestion des statuts vu par les autres utilisateurs mais aussi même pour l'utilisateur lui même à la prochaine connexion.
Mais aussi si je suis connecté, je pars faire la vaisselle :shock: je reviens devant mon pc qui était par exemple sur la page d'accueil, j'actualise et là toutes la variable n'existe plus a cause de la session out et provoque des erreurs.
Donc comment gérer tout ça en fait ?

Mammouth du PHP | 737 Messages

08 oct. 2015, 09:43

Salut,

J'aurai tendance à dire de regarder du côté de ton php.ini

http://php.net/manual/fr/session.config ... e-lifetime

http://php.net/manual/fr/session.config ... axlifetime

Après garder une session ouverte c'est pas forcément "secured"

Mega
;)
Dyslexics are teople poo

Eléphant du PHP | 183 Messages

08 oct. 2015, 13:58

Salut Mega, en fait je sais qu'on peut régler dans le fichier php.ini la durée de session time out, mais là c'est pas vraiment ça que je cherche, de plus là c'est en local mais une fois héberger c'est pas moi qui réglerai le fichier php.ini.
merci quand meme d'avoir répondu.

ViPHP
xTG
ViPHP | 7331 Messages

08 oct. 2015, 14:22

Pour régler ton souci il faut utiliser des requêtes asynchrones pour rafraichir l'état au niveau du serveur.
En gros tu as ton état et sa date de dernière mise à jour.
Tu le rafraichis toutes les X secondes via une requête asynchrone ou bien quand l'utilisateur poste un message.

Et périodiquement tu dois aussi avoir une requête asynchrone qui va faire le ménage dans les inactifs.
Une simple requête qui recherche si la date de mise à jour est supérieure à X et le tour est joué pour avoir la liste des profils à remettre à jour.

Eléphant du PHP | 183 Messages

08 oct. 2015, 15:28

ba en fait j'ai déjà trouvé comment gérer le time out et protéger en même temps l'intrusion par url direct sans être loguer, le gros problème reste que si l'user ferme le navigateur, son statut dans bdd reste sur 1 (connecté)...en effet il faudrait une commande comme t'as dit, mais j'ai du mal a cerner comment le script marche tout seul sur le serveur si le client n'est plus devant son pc :-D
voici mon code de base sans le test du navigateur fermé =>

Code : Tout sélectionner

<?php //Protection après connexion session_start(); $_SESSION['last_access']=time(); $_SESSION['ipaddr']=$_SERVER['REMOTE_ADDR']; //time out 1h $session_timeout=3600; if(!isset($_SESSION['last_access']) || !isset($_SESSION['ipaddr']) || !isset($_SESSION['users'])) { $_SESSION=array(); session_destroy(); header("Location: connexion.php"); die(); } if(time()-$_SESSION['last_access']>$session_timeout) { $_SESSION=array(); session_destroy(); header("Location: connexion.php"); die(); } if($_SERVER['REMOTE_ADDR']!=$_SESSION['ipaddr']) { $_SESSION=array(); session_destroy(); header("Location: connexion.php"); die(); } $_SESSION['last_access']=time(); ?>
Donc là je verifie bien a chaque actualisation si c'est tjs le meme users et depuis combien de temps, mais si rien n'est actualisé car il a fermé son navigateur...statut reste sur connecté...

ViPHP
xTG
ViPHP | 7331 Messages

09 oct. 2015, 13:20

Ce n'est pas le script lié à ce client qu'il faut faire réagir.
Mais justement un script global lancé par tous les clients actifs qui fasse le ménage dans les inactifs.

Et s'il n'y a pas de client actif c'est qu'il n'y a personne pour lire l'information donc ce n'est pas grave si elle n'est pas à jour. ;)

Eléphant du PHP | 183 Messages

09 oct. 2015, 14:22

Merci de me répondre xTG, bon j'avoue que j'ai rien compris :D , par contre il faut absolument que le statut connexion repasse a 0, c'est grave pour le reste du site et surtout pour les autres utilisateur qui font faire appel un user connecté...qui ne l'est pas.

ViPHP
xTG
ViPHP | 7331 Messages

09 oct. 2015, 15:55

En gros il te faut un script sur une page que tout le monde appelle qui fasse la recherche des inactifs et leur change leur état.

Situation pour expliquer cela :
Tu as un pool d'ordinateur utilisé par x personnes.
Mais on ne doit jamais avoir un ordinateur allumé si personne ne l'utilise.
Quand quelqu'un part il l’éteins, c'est la situation normale.
Mais quand quelqu'un va aux toilettes c'est une situation non normale et l'ordinateur reste allumé.

Dans notre exemple le script dont je te parle c'est de faire appel à chaque utilisateur dans la salle.
S'il voit un autre ordinateur que le sien allumé et sans personne devant il va aller l'éteindre lui même.

Eléphant du PHP | 183 Messages

09 oct. 2015, 21:49

Merci pour ta réponse qui m'éclaire un peu plus, donc en gros un script qui => a chaque users qui se connect ou agit sur une autre page du site par exemple pour multiplier les appel au script, cherche dans la bdd si users à une session time out. Par si il y a des milliers de personne sur le site, le serveur va saturé de demande pour cette requete et passé à 0 le statut....

Eléphant du PHP | 183 Messages

11 oct. 2015, 11:27

J'ai réfléchi à ça, en fait il faudrait une sorte de "cron" ou "daemon" qui tourne sur le serveur tout seul ? mais comment faire ?

Mammouth du PHP | 1341 Messages

11 oct. 2015, 15:50

si la requete est bien faite, non, même avec beaucoup de monde, cela ne va pas saturer le serveur, donc le cron qui lancerait la vérification, même quand il n'y a personne, n'est pas indispensable.

Eléphant du PHP | 183 Messages

11 oct. 2015, 17:43

Salut or 1, ok pour la requête incluse dans le script de mes pages activés à chaque actualisation de page d'un users, mais l'idée d'un cron indépendant des utilisateurs eux même qui tournerai sur le serveur à faire que ça me plait mieux, est-ce possible ? en php ?
car j'en quand même peur que si à chaque actualisation de page de chaque utilisateur il y a un "scan" de toute la base de donnée pour passer a 0 les déconnecté, ça va quand même devenir une sacré usine à gaz si il y a des milliers de personne donc des milliers au carré de requete?
Comment gère facebook ou skype par exemple les connexions, enfin les utilisateurs connecté qui s'affiche dans la liste des autres et inversement, en temps réel?

ViPHP
xTG
ViPHP | 7331 Messages

12 oct. 2015, 10:40

Bah le cron c'est la même chose, c'est le même code mais déporté dans un fichier qui sera appelé par le Cron et non plus à chaque accès de la page. ;)

Mais sinon ce sont deux bêtes requêtes pour faire ce que tu veux. C'est pas ça qui va saturer un serveur, ou bien il a un sacré problème ton serveur.

Eléphant du PHP | 183 Messages

12 oct. 2015, 10:46

ok je vais reprendre ton idée de la salle de classe, mais, comment je vois si ya personne devant l'ordi de cette classe, puisque en gros dans ma bdd le statut du bourrin qui fermé ça fenetre sans déconnecté aura toujours son statut_connexion à 1, alors si je fais une requete il semblerai connecté j'aurais toujours pas vu qu'en fait il est partit...

ViPHP
xTG
ViPHP | 7331 Messages

12 oct. 2015, 11:00

Il te faut rajouter la date et l'heure de dernière mise à jour du statut dans ta table. ;)
En gros un timestamp.