PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 06-06-2012 11:13:45

jrm2010
Membre
Inscription : 06-06-2012
Messages : 3

deconnexion automatique du site

Bonjour,
J'ai actuellement besoin de déconnecter un utilisateur lorsqu'il est inactif durant un certain temps.
Pour cela j'ai pensé include une page dans toutes mes autres pages php.

Voici la page que j'include:

 <?php
 // ajoute 15min au timestamp
$timeExpire = time() + 900;
?>

 <script type="text/javascript">
boucleTime();
function boucleTime()
{
  settimeout(deco(),10000);
  cleartimeout(settimeout);
}

function deco()
{
  // convertie timestamp js (milliseconde) en seconde
  var timeNow = new Date().getTime();
  timeNow = timeNow * 0.001;
  timeNow = Math.floor(timeNow);

  //récupère le timestamp php
  var timeExpire = '<?php echo $timeExpire; ?>' ;
  if (timeNow >= timeExpire)
  {
    window.location='../index.php';
    alert("Vous avez été inactif durant un certain temps, veuillez vous reconnecter svp.");
  }
}
 </script>

Normalement, je récupère le timestamp en php, auquel j'ajoute un certain temps avant que la session expire.
Je récupère ce timestamp dans mon code javascript et avec un settimeout, toutes les 10 secondes je compare le timestamp javascript avec celui du php.
Me renvoyer sur index.php me déconnecte automatiquement.

Si quelqu'un a la solution à mon problème, je suis preneur smile
Merci.

EDIT: J'ai réussi! Le problème c'est que maintenant si j'ouvre deux onglets et que sur une je suis inactif, cela va me détruire ma session. Comment faire pour contourner cela ? (Utiliser autre chose que session_destroy sur ma page index.php ?)

ps: Le code de mon include:

 <?php
 // ajoute 15min au timestamp
$timeExpire = time() + 900;
?>

 <script type="text/javascript">
setInterval("deco()", 10000);

function deco()
{
  // convertie timestamp js (milliseconde) en seconde
  var timeNow = new Date().getTime();
  timeNow = timeNow * 0.001;
  timeNow = Math.floor(timeNow);

  //récupère le timestamp php
  var timeExpire = '<?php echo $timeExpire; ?>' ;
  if (timeNow >= timeExpire)
  {
    alert("Vous avez été inactif durant un certain temps, veuillez vous reconnecter svp.");
    window.location='../index.php';
  }
}
 </script>

Dernière modification par jrm2010 (06-06-2012 13:07:24)


Hors ligne

#2 06-06-2012 22:31:55

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 620
Site Web

Re : deconnexion automatique du site

Bonjour,

Si vous voulez gérer cela du coté client, il faut le faire comme une application web gérant le mode offline, c'est à dire avec le localstorage, puisque vous émettez la possibilité de travailler avec plusieurs onglets sur la même session.
Sinon si vous n'avez pas besoin d'une telle gestion (gestion mode offline) c'est quelque chose que l'on évite en gérant cela côté PHP en "pingant" la session à chaque requête. Cela a le mérite de plus de limiter les requêtes au serveur tiers.

++

Dernière modification par Jc (06-06-2012 22:32:49)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#3 07-06-2012 09:21:48

jrm2010
Membre
Inscription : 06-06-2012
Messages : 3

Re : deconnexion automatique du site

Merci de ta réponse.
Je me suis renseigné sur le localstorage et cela fonctionne avec le HTML5. Tous les navigateurs ne sont pas compatible actuellement, ce qui rend cette méthode peu pratique.
Pourrait-tu m'en dire plus sur le "ping" de la session. Je ne comprend pas vraiment.

ps: J'ai encore modifié mon include, je suis déçu je pensais vraiment que ça allait marcher en changeant ma variable avec une autre de session.

 <?php
  // ajoute 15min au timestamp
$_SESSION['timer']= time() + 60;
?>

 <script type="text/javascript">

 setInterval("deco()", 10000);

function deco()
{
  // convertie timestamp js (milliseconde) en seconde
  var timeNow = new Date().getTime();
  timeNow = timeNow * 0.001;
  timeNow = Math.floor(timeNow);

  //récupère le timestamp php
  var timeExpire = '<?php echo $_SESSION['timer']; ?>' ;
  if (timeNow >= timeExpire)
  {
    window.location='../index.php';
  }
}
 </script>

Hors ligne

#4 07-06-2012 11:05:59

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 620
Site Web

Re : deconnexion automatique du site

Bonjour,

Pour information, si le localstorage est propre au html5 technologiquement parlant, il n'est pas dépendant de la DTD, et il n'est accessible que par javascript.
Tu peux donc l'utiliser sur le navigateur de ton choix (IE,chrome,FF,Opera,Safari pour le moins). La seule différence, c'est que le cache dont tu disposes (10Mo prévu par le standard) n'est pas égal selon les navigateurs, mais reste du même ordre:  tu as donc de la marge.

En ce qui concerne le ping de session, je ne sais pas si c'est répandu, mais c'est quelque chose que j'ai mis en place dans mes développements. Cela consiste lors de la vérification de connexion pour afficher une page ou retourner des informations de mode connecté en PHP, de disposer d'une table de gestion de session en BD avec une colonne de type DATETIME intitulée "lastping" et de comparer au niveau BD que UNIX_TIMESTAMP(lastping)-UNIX_TIMESTAMP(now()) n'est pas supérieur au paramètre timeout en secondes défini au niveau applicatif, auquel cas, on clôture la session utilisateur en BD et on retourne un message de timeout à l'utilisateur.

Cette technique à l'avantage de ne pas solliciter le serveur en dehors d'une requête utilisateur, limite l'encombrement réseau, et préserve les performances.

++

Dernière modification par Jc (07-06-2012 11:08:39)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#5 08-06-2012 08:07:39

jrm2010
Membre
Inscription : 06-06-2012
Messages : 3

Re : deconnexion automatique du site

Merci de tes conseils, la déconnexion auto avec la gestion des onglets fonctionne, même si je n'est pas utilisé tes techniques smile

timerDeco.php:

 <?php
$_SESSION['timer']= time() + 2400;

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 2.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml2.dtd">
 <script type="text/javascript">

 setInterval("deco()", 3000);
function connexion()
  {
    var xhr_object = null;
    if(window.XMLHttpRequest) // Firefox
      xhr_object = new XMLHttpRequest();
    else if(window.ActiveXObject) // Internet Explorer
      xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
    else { // XMLHttpRequest non supporté par le navigateur
      alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
    return;
      }
      return xhr_object;
  }
function deco()
{
  var timeNow = new Date().getTime();
  timeNow = timeNow * 0.001;
  timeNow = Math.floor(timeNow);

  var xhr_object=connexion();
      xhr_object.open('POST',"../RetourTimer.php",false);
      xhr_object.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
      xhr_object.onreadystatechange=function(){
        if(xhr_object.readyState == 4)
        {
          if (xhr_object.responseText=="DECONNECTER")
          {
            window.location='../index.php';
          }
          else if (timeNow >= xhr_object.responseText)
          {
            window.location='../index.php';
          }
        }
      }
      xhr_object.send("" ,true);
}

</script>

RetourTimer.php

<?php
session_start();
if(isset($_SESSION['timer']))
echo $_SESSION['timer'];
else echo "DECONNECTER";
?>

Merci smile

Dernière modification par jrm2010 (08-06-2012 10:23:53)

Hors ligne

#6 13-06-2012 13:40:04

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 620
Site Web

Re : deconnexion automatique du site

Bonjour,

Si j'ai dit que pour gérer le mode offline on avait besoin du localstorage ce n'était pas pour tester la connexion, mais plutôt pour continuer à utiliser l'application lorsque le serveur n'est pas disponible. D'ailleurs à ce propos votre code est incomplet dans le sens où des cas de figure ne sont pas pris en compte. Ici seul le cas où un retour du serveur a lieu est pris en compte. Dans le cas d'une perte de connexion internet, de serveur non disponible, etc, les différents codes retour apache associés ne sont pas gérés/pris en compte. De plus votre timer Js n'est pas synchronisé avec le timer au niveau BD ou PHP si le contrôle de timeout n'est géré qu'au niveau PHP (non recommandé).

Mon avis sur votre code si vous me le permettez :
Ce code est la base (car incomplet comme dit précedemment) pour gérer un mode offline et son utilisation devrait se limiter à cela avec un contrôle de session côté PHP. A mon sens c'est une "Best practice" que de l'utiliser comme cela.
La raison principale en est justement les problèmes que cela implique avec un minimum de volumétrie. Si les applications qui gèrent le mode offline sont développées le plus souvent dans un contexte intranet et par conséquent limité en terme de nombre d'utilisateurs (commerciaux, etc...) et donc dans une volumétrie maîtrisée, dans un contexte public il en est tout autrement: ne serait-ce qu'avec 1000 utilisateur qui requêtent le serveur PHP toutes les x millisecondes juste pour avoir l'info "ok", cela crée une contention inutile parfois au détriment d'une vente sur votre site, alors que cela peut être évité simplement.

Bonne continuation.

++

Dernière modification par Jc (13-06-2012 14:56:11)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#7 12-01-2015 12:27:05

whitecrow4
Membre
Inscription : 12-01-2015
Messages : 1

Re : deconnexion automatique du site

Salut MK,
Parce que l'unicité n'est pas censée être globale au DOM. Chaque balise du DOM est un objet au niveau du DOM qui réponds tout comme chaque bon objet qui se respecte à des règles d'héritage. L'unicité doit se vérifier dans une arborescence donnée ou à un niveau commun donné pour rester valide.


white

Hors ligne

Pied de page des forums