web-dev-qa-db-fra.com

PHP - Session détruite après la fermeture du navigateur

Bien que cette question comporte plusieurs doublons, je ne trouvais pas la solution appropriée pour moi . Besoin d'aide.

J'ai utilisé ini_set('session.cookie_lifetime', 0); dans mon fichier de configuration.

Mais cela ne m'aide pas à détruire la session lorsque le navigateur est fermé. 

Flux de courant d'application:

1) Dans la page d'authentification, si l'utilisateur est valide, générez le nouvel identifiant de session à l'aide de session_regenerate_id(true);.

2) Le contrôle va à welcome.php où je commence une nouvelle session en utilisant session_start();

3) dans la déconnexion, le code de la page est 

      $_SESSION = array();
      if (ini_get("session.use_cookies")) {
        $params = session_get_cookie_params();
        setcookie(session_name(), '', time() - 42000,
        $params["path"], $params["domain"],
        $params["secure"], $params["httponly"]
      );
     }
    // Finally, destroy the session.
    session_destroy();
9
Shri

La meilleure façon de fermer la session est la suivante: s'il n'y a pas de réponse pour cette session après un intervalle de temps particulier. puis fermez. S'il vous plaît voir ce post et j'espère que cela va résoudre le problème. " Comment changer le délai d'expiration de la session en PHP? "

6
Ankit

Utilisez un donjon vivant.

Sur la connexion:

session_start();
$_SESSION['last_action'] = time();

Un appel ajax toutes les quelques secondes (par exemple 20):

windows.setInterval(keepAliveCall, 20000);

Keepalive.php côté serveur:

session_start();
$_SESSION['last_action'] = time();

Sur toute autre action:

session_start();
if ($_SESSION['last_action'] < time() - 30 /* be a little tolerant here */) {
  // destroy the session and quit
}
6
colburton

Il existe différentes façons de procéder, mais le serveur ne peut pas détecter le moment où le navigateur est fermé. Il est donc difficile de le détruire.

  • session de timeout.

Créez une nouvelle session avec l'heure actuelle ou ajoutez une variable d'heure à la session actuelle. puis vérifiez-le lorsque vous démarrez ou effectuez une action pour voir si la session doit être supprimée.

session_start();
$_SESSION["timeout"] = time();
//if 100 seconds have passed since creating session delete it.
if(time() - $_SESSION["timeout"] > 100){ 
    unset($_SESSION["timeout"];
}
  • ajax

Assurez-vous que javascript exécute un appel ajax qui supprimera la session, avec onbeforeunload() une fonction javascript qui appelle une action finale lorsque l'utilisateur quitte la page. Pour une raison quelconque, cela ne fonctionne pas toujours bien.

  • supprimez-le au démarrage.

Si vous voulez toujours que l'utilisateur voie la page de connexion au démarrage après la fermeture de la page, vous pouvez simplement supprimer la session au démarrage.

<? php
session_start();
unset($_SESSION["session"]);

et il y en a probablement d'autres.

4
kpp

Cela pourrait vous aider,

session_set_cookie_params(0);
session_start();

Votre cookie de session sera détruit ... donc votre session sera bonne jusqu'à ce que le navigateur soit ouvert. veuillez consulter http://www.php.net//manual/fr/function.session-set-cookie-params.php ceci peut vous aider.

2
Adil Abbasi

Il y a encore un "hack" utilisant HTTP Referer (nous supposons que la fenêtre du navigateur a été fermée. Le nom de domaine du référent actuel et le nom de domaine de la page courante ne correspondent pas):

session_start();
$_SESSION['somevariable'] = 'somevalue';

if(parse_url($_SERVER["HTTP_REFERER"], PHP_URL_Host) != $_SERVER["SERVER_NAME"]){
    session_destroy();
}

Cela a aussi des inconvénients, mais cela m'a aidé à quelques reprises.

1
DTT

Vous pouvez le faire en utilisant JavaScript en déclenchant une requête ajax sur le serveur pour détruire la session lorsque l'événement onbeforeunload est déclenché lorsque nous fermons l'onglet de navigation, la fenêtre ou le navigateur.

1
itzmukeshy7

Utilisez le code suivant pour détruire la session: 

 <?php
    session_start();
    unset($_SESSION['sessionvariable']);
    header("Location:index.php");
    ?>
0
user3774008