Gestion session

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Gestion session

Re: Gestion session

par laplumaencre » 30 janv. 2016, 16:37

Salut Tout le monde,
je reviens sur mon post car après utilisateur du site en suivant cette idée de script des actif, qui nettoie les inactif :-) , ça marche plutôt bien sauf que quand on test le site sur un smartphone avec un réseau de mer...là ça fout tout le système en l'air. J'ai fait donc un script qui envois le time toutes les 5s, et un autre qui repasse les users qui ont un time>time+11secondes (un peu marge pour quand même) a statut_connexion=0, mais avec réseau 3g, ça coupe un utilisateur qui croit toujours être connecté se retrouve dans la bdd en mode off, et donc personne peu le contacter alors que lui, il attend comme un c... qu'on l'appel...
Gros problème là, et comme c'est la seule solution que j'avais trouvé (et qu'on m'avait conseillé ici), je vois toujours pas comment réellement savoir quand un utilisateur est déconnecté ou pas, ou a fermer son navigateur en mode bourrin sans cliquer sur déconnecté...

Re: Gestion session

par laplumaencre » 13 oct. 2015, 14:49

A ok xTG, si bien compris je devrais plutôt faire ça =>

Code : Tout sélectionner

$time_out = time() - 11; //Cherche les id des user qui n'ont pas a jour leur timestamp, donc deconnecté ou navigateur fermé $res = $bdd->prepare("UPDATE inscription SET statut_connexion=0, statut_chat=0 WHERE online_time<=:time_out "); $res->bindParam ('time_out', $time_out, PDO::PARAM_INT); $res->execute()or die('Erreur dans la requete '.$res);
ET c'est bon pas d'erreur ET ça passe bien les user à 0, et si je modif dans la bdd le statut, quelques secondes après il repasse bien à 0 sauf l'user en cours de connexion ??
YAHOOOOOOOOOOOOOOOOOOOO !!
GRAND merci à vous, pour m'avoir mis sur la bonne voix !
=D> :lol: :P :P :D :shock: :shock: :priere: :priere: :mrgreen: :mrgreen:

Re: Gestion session

par laplumaencre » 13 oct. 2015, 13:21

SISI ça y est regarde ma réponse j'ai vu mon erreur et corrigé, mais toujoours la même erreur.
Sinon lister les id n'est pas gerable, car une fois en route il y aura peut etre des milliers d'id, et je vais pas modifier ma requete a chaque fois qu'il y a un nouvel inscrit :-)
Sinon ça y est j'ai compris la différence entre bindValue et param, mais bon toujours cette erreur...

EDIT : Déjà j'ai viré la ligne id, car je cherche tous les id, pas que celui de l'user en cours....bete erreur, mais corrigé donc =>

Bon maintenant j'ai plus d'erreur, mais et hé oui mais :-D, j'ai noté des users en connecté et un chat qui ont un timestamp à 0, donc en théorie, ils auraient dû passer au bout de 5s ( coupe de script) aux statut connexion et chat à 0, et il y a eu q'un seul user remis hors ligne ?

Code : Tout sélectionner

$time_out = time() - 5; //Cherche les id des user qui n'ont pas a jour leur timestamp, donc deconnecté ou navigateur fermé $res = $bdd->prepare("SELECT id FROM inscription WHERE online_time < :time_out "); $res->bindParam ('time_out', $time_out, PDO::PARAM_INT); $res->execute()or die('Erreur dans la requete '.$res); if ($res->rowCount() ) { $total_user = $res->fetch(PDO::FETCH_ASSOC); foreach ($total_user as $id) { echo $id; $res = $bdd->prepare("UPDATE inscription SET statut_connexion=0 AND statut_chat=0 WHERE id =:id "); $res->bindParam ('id', $id, PDO::PARAM_INT); $res->execute()or die('Erreur dans la requete '.$res); }
:evil:

Re: Gestion session

par xTG » 13 oct. 2015, 13:17

$res = $bdd->prepare("SELECT id FROM inscription WHERE online_time < :time_out ");
$res->bindParam ('id', $id, PDO::PARAM_INT);
$res->bindParam ('online_time', $time_out, PDO::PARAM_INT);
En rouge les paramètres de ta requête.
En bleu les paramètres que tu injectes dans la requête.

Tu vois pas comme un souci ? ;)

Sinon tu peux faire plus optimisé que cela en construisant une liste des IDs afin de ne faire qu'une seule requête.
Exemple :
UPDATE maTable SET champs=0 WHERE id IN (1,2,3,5,19,50)

Re: Gestion session

par laplumaencre » 13 oct. 2015, 13:03

Salut or 1, j'ai essayé avec bindValue, et ça fait pareil, de plus j'ai d'autre fonction qui marche avec plusieurs binValue, mais j'avoue que j'ai encore du mal avec pdo, je suis souvent tenté de refaire un bon vieux mysql_query....et hop requete, enfin faut que j'apprenne pour l'avenir, donc pdo avec du mal :-)

Je viens de voir par contre une erreur, itme_out pour time_out, c'est mieux que online pour time_out :-D =>

Code : Tout sélectionner

$res->bindValue ('time_out', $time_out, PDO::PARAM_INT);
là c'est mieux deja, mais tjs la même erreur

Re: Gestion session

par or 1 » 12 oct. 2015, 22:54

une requete préparée avec un paramètre et 2 bindParam, d'où "number of bound variables does not match number of tokens"

Re: Gestion session

par laplumaencre » 12 oct. 2015, 21:17

Bon me revoila j'ai travaillé sur cette affaire, alors, deja j'ai fait une fonction appelé en ajax toutes les 5s, qui actualise le timestamp de l'user en cours dans un champ de la bdd, un bigINT sinon time stamp en sql ça fait un truc de merde, mais ça marche, et au paasage actualise aussi ma liste d'amis donc toutes les 5s (surtout leurs statut et non plus qu'une la page chargé !)
Donc ensuite je suis en train de faire une fonction qui va gerer cette fois "GESTION GLOBAL des users connecté/expérié/ou déconnecté en mode bourrin
Donc en gros c'est ça =>

Code : Tout sélectionner

function control_online_user() { try { $bdd = new PDO ('mysql:host=localhost;dbname=xxx;charset=utf8', 'root', ''); $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch(Exception $e) { die('Erreur : '.$e->getMessage()); } $id = $_SESSION['id']; $time_out = time() - 5000; //Actualise le timestamp de l'utilisateur $res = $bdd->prepare("SELECT id FROM inscription WHERE online_time < :time_out "); $res->bindParam ('id', $id, PDO::PARAM_INT); $res->bindParam ('online_time', $time_out, PDO::PARAM_INT); $res->execute()or die('Erreur dans la requete '.$res); if ($res->rowCount() ) { $total_user = $res->fetch(PDO::FETCH_ASSOC); foreach ($total_user as $user) { $id = $user['id']; $res = $bdd->prepare("UPDATE inscription SET statut_connexion=0 AND statut_chat=0 WHERE id =:id "); $res->bindParam ('id', $id, PDO::PARAM_INT); $res->execute()or die('Erreur dans la requete '.$res); } } }
Mais j'ai une erreur il semble dès la premiere requete !
ERREUR =>
<br /> <b>Fatal error</b>: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens' in /home/*****/function.php:348 Stack trace: #0 /home/*****/function.php(348): PDOStatement->execute() #1 /home*****/gestion_connexion_users.php(8): control_online_user() #2 {main} thrown in <b>/home/*****/function.php</b> on line <b>348</b><br />

Ya un probleme surement entre le timestamp de php et mysql qui semble pas parlé de la meme chose ?!%*

Re: Gestion session

par xTG » 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.

Re: Gestion session

par laplumaencre » 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...

Re: Gestion session

par xTG » 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.

Re: Gestion session

par laplumaencre » 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?

Re: Gestion session

par or 1 » 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.

Re: Gestion session

par laplumaencre » 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 ?

Re: Gestion session

par laplumaencre » 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....

Re: Gestion session

par xTG » 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.