web-dev-qa-db-fra.com

Comment garder la session vivante sans recharger la page?

J'ai un problème étrange dans mon système de gestion des tests en ligne.

Certains utilisateurs du formulaire de test (test.php) ont besoin de beaucoup de temps pour répondre à la question et soumettre le formulaire.

Après avoir soumis le formulaire, la session est expirée et l'utilisateur doit se reconnecter

ce n'est pas un problème de code

Je mets cette valeur en haut de toutes les pages

ini_set('session.gc_maxlifetime', 18000);

Existe-t-il un moyen de rafraîchir la session evrey 10 minutes sans recharger la page sous forme de test pour empêcher l'expiration de la session?

Aidez-moi, s'il vous plaît

Merci

22
Mohammad Masoudian

Vous pouvez utiliser javascript XHR, ou comme d'autres l'appellent, AJAX.

En utilisant ajax, vous pouvez appeler un script php qui rafraîchit votre session toutes les 10 minutes. :)


C'est aussi loin que je peux aller à "exact".

javascript

var refreshSn = function ()
{
    var time = 600000; // 10 mins
    setTimeout(
        function ()
        {
        $.ajax({
           url: 'refresh_session.php',
           cache: false,
           complete: function () {refreshSn();}
        });
    },
    time
);
};

// Call in page
refreshSn()

refresh_session.php

<?php
session_start();

// store session data
if (isset($_SESSION['id']))
$_SESSION['id'] = $_SESSION['id']; // or if you have any algo.
?>

Quoi qu'il en soit, une autre solution serait d'étendre le temps de session pour la page de test uniquement en utilisant la solution présentée ici

Comment puis-je expirer une session PHP après 30 minutes?

32
gianebao

Tout ce dont vous avez besoin est le suivant (utilise jQuery pour $ .post):

JavaScript (mettez ceci dans votre fonction onload ou quelque chose)

setInterval(function(){$.post('path/to/refresh_session.php');},600000); //refreshes the session every 10 minutes

refresh_session.php

<?php
  session_start();

  if (isset($_SESSION['token'])) { //if you have more session-vars that are needed for login, also check if they are set and refresh them as well
    $_SESSION['token'] = $_SESSION['token'];
  }
?>

(Je sais que c'est à peu près la même que la réponse acceptée, je voulais vraiment commenter celle-ci mais je n'ai pas encore assez de réputation.
Le plus gros changement est dans le JavaScript, vous n'avez pas besoin d'une fonction entière, juste une ligne.)



INFORMATIONS SUPPLÉMENTAIRES:

Bien que je pense qu'il suffit d'appeler session_start() dans le php, si je lis bien ( http://nl3.php.net/function.session-start ):

Le rappel de lecture récupérera toutes les données de session existantes (stockées dans un format sérialisé spécial) et sera non sérialisé et utilisé pour remplir automatiquement la superglobal $ _SESSION lorsque le rappel de lecture ramènera les données de session enregistrées à PHP = gestion de session.

Et pendant les tests, je ne mets que le code ci-dessus sur ma page visiteur, et non sur la page d'administration. Mais j'avais les deux pages ouvertes dans le même navigateur (Chrome), et la page d'administration est également restée connectée, au moins pendant plus d'une heure (ne vérifie plus). MAIS, je ne sais pas si cela fonctionne toujours si vous utilisez uniquement session_start(), sans actualiser manuellement aucune session-var du tout ..

Quoi qu'il en soit, j'aime être sûr que les variables de session dont j'ai besoin sont toujours là :)

12
myfunkyside