Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1690 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Session et expiration automatique

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Session et expiration automatique

n°2112644
mohoi
Posté le 21-11-2011 à 16:48:29  profilanswer
 

Bonjour,
 
Je suis actuellement en train de développer un intranet qui possède une interface administrateur. L'intégralité de l'intranet se génère dans un page "mère" uniquement grâce à un jeu de condition et d'include.
 
J'ai mis en place des sessions à l'aide de ma basse de données. C'est a dire que j'ai une table "administrateur" comme suit:
 
ID_ADMINISTRATEUR / PSEUDO / PASSWORD / CONNECTION
La colonne connexion est égale à 0 si la personne n'est pas connecté et 1 si elle l'est.
 
Donc, lorsqu'un administrateur essaye de se connecter avec un compte qui est déjà utilisé, l'accès est refusé.  
 
Lorsque la session est inactive trop longtemps, mais que la fenêtre est toujours ouverte, un peu de JavaScript (Trouver sur le web) me permet de la fermer.
 
PAGE : index.html

Code :
  1. <script type="text/javascript" src="script/time_out.js"></script>
  2. <body onmousemove="temps=0" onload='time_out();'>


 
PAGE: time_out.js

Code :
  1. var temps=0;
  2. function time_out()
  3. {
  4. if(temps < 1800)
  5.  temps++;
  6. else
  7.  location.href = "./index.php?account=logout";
  8. setTimeout('time_out()',1000)
  9. }


 
Ce code est fonctionnel.  
 
Cependant, lorsque la personne ferme la fenêtre, le champ "Connection" est toujours sur 1. C'est évident puisqu'il n'y a pas eu de requête SQL pour changer le "1" en "0".
 
Je n'arrive pas a trouver de solution au fait que la personne ferme la fenêtre.
 
Comment faire pour faire expirer la session, en changeant le champ "Connection", si la personne ferme la fenêtre sans passer par ma fonction "Déconnexion" en php ou "Time_out" en JavaScript?
 
Merci d'avance.

mood
Publicité
Posté le 21-11-2011 à 16:48:29  profilanswer
 

n°2112696
mohoi
Posté le 22-11-2011 à 08:34:15  profilanswer
 

Up matinal!

n°2112738
Tirkyth
Posté le 22-11-2011 à 11:59:10  profilanswer
 

Salut,
 
En gros, en plus du champs connexion qui te permet de savoir si quelqu'un est connecté, il te faudrait un autre champ, un timestamp, qui t'indique la dernière fois que tu as vu cette personne.
 
A chaque fois que quelqu'un affiche une page, tu mets à jour cette données.
 
D'un autre côté, il te faut une tache type "cron", qui s’exécute par exemple toutes les 5 minutes, et qui va déconnecter automatiquement les gens qui sont indiqué comme connecté mais qui n'ont pas affiché de page depuis par exemple 5 minutes ou 10 minutes ou ce que tu veux, c'es toi qui choisi. Il te suffit de faire passer leur champ connection à 0 et voilà, même si la personne n'est pas passé par ta couche javascript pour se déconnecter, elle sera déconnectée après quelques minutes.


---------------
Mon Feedback !
n°2112768
rufo
Pas me confondre avec Lycos!
Posté le 22-11-2011 à 13:51:04  profilanswer
 

La solution est de Tirkyth est bonne. Sinon, une autre : sur unload, tu mets un js qui sera appelé et qui enverra une requête ajax à ton serveur pour mettre à 0 la connexion ;)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2112775
Tirkyth
Posté le 22-11-2011 à 14:30:31  profilanswer
 

Tiens Rufo, petite question pour toi :

 

Je n'ai jamais été fan du unload car j'ai du mal à imaginer le comportement du navigateur.
Dans ce cas précisément, en considérant que l'url appelée pour mettre à 0 le champ connexion prenne 30 secondes à envoyer une réponse, comment se comporte le navigateur lorsque je le ferme (avec la croix en haut de la fenêtre) ?

 

D'après ce que tu indiques, il va donc exécuter le javascript associé à l'évènement unload. C'est fiable ? Genre ça fonctionne à 100% ?
Vu que la réponse va arriver seulement 30 secondes après, pendant 30 secondes il attend avant de se fermer ou il se ferme et se fou de la réponse ?

 

Merci à toi si tu peux m'en dire un peu plus. Je n'ai jamais osé faire confiance à cet évènement unload, mais il n'est pas trop tard pour changer d'avis ^^

 

Edit : Et sinon juste pour appuyer ma solution un peu plus : Si le navigateur crash, là par contre le  unload ne sera pas appelé. Du coup, appliquer les deux solutions serait finalement l'idéal non ? Le javascript serait utilisé pour ceux qui ferment leur navigateur normalement, puis dans le cas ou quelqu'un a son ordi qui crash, la tache cron que je suggère pourrait nettoyer les cas non traités par le javascript.


Message édité par Tirkyth le 22-11-2011 à 14:32:34

---------------
Mon Feedback !
n°2112786
rufo
Pas me confondre avec Lycos!
Posté le 22-11-2011 à 14:49:01  profilanswer
 

Pour unload, jamais fait de tests... Mais implémenter les 2 solutions n'est pas incompatible. Je pense malgré tout que ta solution est plus globale, donc pas la peine de se prendre la tête à faire les 2 ;) Si j'ai proposé la solution unload, c'est pour qu'il ait le choix.


Message édité par rufo le 22-11-2011 à 14:49:39

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2112954
mohoi
Posté le 23-11-2011 à 13:57:46  profilanswer
 

Bonjour,  
 
Je vous remercie d'avoir répondu. C'est vraiment gentil!
 
Tirkyth, ton idée me parait très bonne. Je pense donc allé vers celle-ci!
 
Mais comment faire pour créer une tache de type "cron"?
 
Peux tu développer un peu plus cette petite bete, qui a l'air merveilleuse!
 
Merci d'avance!

n°2112959
Tirkyth
Posté le 23-11-2011 à 14:16:31  profilanswer
 

"cron" en fait c'est un programme disponible sur les environnements unix/linux qui permet d’exécuter quelque chose de façon régulière.
 
Ce que j'appelle "tâche cron" donc, c'est juste un fichier PHP, qui sera executé par "cron" toutes les 5 minutes par exemple dans ton cas. Et ce fichier, il irait juste regarder dans la base de données les gens qui sont indiqués comme connectés mais qui n'ont pas affiché de page depuis 10 minutes, pour les déconnecter.
 
Il faut bien évidemment pour pouvoir faire ça t'assurer que tu as un bon contrôle sur le serveur sur lequel ton application ou site sera hébergé. Souvent, sur les hébergements mutualisés, il n'est pas possible de mettre en place ce genre de choses.


---------------
Mon Feedback !
n°2112963
rufo
Pas me confondre avec Lycos!
Posté le 23-11-2011 à 14:28:31  profilanswer
 

Pour info, y'a des "web-cron", des sites qui proposent plus ou moins gratuitement d'exécuter des scripts php périodiquement...


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2112969
mohoi
Posté le 23-11-2011 à 14:53:32  profilanswer
 

Super! Je comprend très bien!
 
Je vais voir ça avec la société pour laquelle je travaille!
 
Je vous tiendrai au courant de la réussite du projet!

mood
Publicité
Posté le 23-11-2011 à 14:53:32  profilanswer
 

n°2113286
mohoi
Posté le 25-11-2011 à 16:33:10  profilanswer
 

Bonjour!
 
Alors j'ai essayé de configurer le "crontab" de mon serveur!
 
Mais je ne peux pas savoir si il marche ou pas car mon script est bugué!
 
Lorsque j’exécute mon script avec avec la commande "php time_out.php", je recois l'erreur :
 
PHP Warning: Directive 'register_globals' is deprecated in PHP 5.3 and greater in line Unknown on line 0.
 
J'ai regardé mon php.ini est "register_globals" est a "off" en "Local value" mais a "on" en "Master value".
 
Et mon script ne veux pas s’exécuter!
 
Pouvez-vous encore m'aider s'il vous plait?

n°2113289
mohoi
Posté le 25-11-2011 à 16:38:20  profilanswer
 

Au passage voici mon script:
 

Code :
  1. /*Script de verification des connections inactives*/
  2. try
  3. {
  4.  $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
  5.  $bdd = new PDO('mysql:host=localhost;dbname=intranet', 'root', '', $pdo_options);
  6.  $reponse = $bdd->query("SELECT time_out, id_utilisateur AS id FROM utilisateur WHERE connection = '1'" );
  7.  $utilisateur = $reponse->fetchAll(PDO::FETCH_OBJ);
  8.  $reponse->closeCursor();
  9.  $step = time();
  10.  foreach ($utilisateur AS $u)
  11.  {
  12.   if ($u->time_out <= $step)
  13.   {
  14.    $reponse = $bdd->prepare("UPDATE utilisateur SET connection = '0', time_out = '0' WHERE id_utilisateur = :id" );
  15.    $reponse->execute(array('id' => $u->id));
  16.    $reponse->closeCursor();
  17.   }
  18.  }
  19.  unset($step);
  20.  unset($utilisateur);
  21. }
  22. catch (Exception $erreur)
  23. {
  24.  die ('Impossible d\'executer le script de vérification.');
  25. }

n°2113509
mohoi
Posté le 28-11-2011 à 08:02:15  profilanswer
 

Up ?!

n°2113571
rufo
Pas me confondre avec Lycos!
Posté le 28-11-2011 à 14:30:46  profilanswer
 

T'es sûr d'avoir modifié le bon php.ini, celui effectivement chargé utilisé?


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2113665
MEI
|DarthPingoo(tm)|
Posté le 28-11-2011 à 17:20:56  profilanswer
 

Pas besoin de cron je pense, il suffit que tu lance ton traitement pendant la validation du login... Ça sera de toutes façons très court (d'autant que tu peux tout faire en une seule requête SQL...) en traitement...


---------------
| AMD Ryzen 7 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
n°2114490
mohoi
Posté le 02-12-2011 à 14:57:08  profilanswer
 

J'ai trouvé la solution.  
 
Dans le "php.ini", dans le commentaire des "register_globals", ils disent qu'ils traite ça dans un autre fichier.
 
C'est la bas qu'il faut allez voir!


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Session et expiration automatique

 

Sujets relatifs
[RESOLU] Recuperer tableau associatif de ma sessionMise à jour automatique de code / script
Probleme Session / popup et redirectionHelp Me !! VBA 2007 impression et ouverture automatique de PDF
Gestion de tableau avec tri automatiqueProblème Session PHP
[VBA excel] incrémentation et impréssion automatique$_SESSION=$_POST;
[demande] envoi automatique de produit numerique 
Plus de sujets relatifs à : Session et expiration automatique


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR