PHP ini_set('session.gc_maxlifetime', 5) - Pourquoi il ne veut pas la fin de la session?
Le script PHP est comme suit:
<?php //continue.php
ini_set('session.gc_maxlifetime', 5);
session_start();
echo ini_get('session.gc_maxlifetime');
//wait for 7 seconds
usleep(7000000);
if (isset($_SESSION['username']))
{
$username = $_SESSION['username'];
$password = $_SESSION['password'];
$forename = $_SESSION['forename'];
$surname = $_SESSION['surname'];
echo "Welcome back $forename.<br />
Your full name is $forename $surname.<br />
Your username is '$username'
and your password is '$password'.";
}
else echo "Please <a href=authenticate2.php>click here</a> to log in.";
?>
Basé sur le délai d'attente (c'est à dire 5 secondes), le script ne doit pas imprimer quoi que ce soit.
Cependant, j'ai toujours le message suivant s'affiche
5Welcome back Bill. Your full name is Bill Smith. Your username is 'bsmith' and your password is 'mysecret'.
Il semble que la ligne de la fonction ini_set('session.gc_maxlifetime', 5) ne fonctionne pas comme il devrait l'être.
Je suis à l'aide de windowsXP + XAMMP.
Pouvez-vous me dire comment le faire fonctionner?
Merci
Vous devez vous connecter pour publier un commentaire.
Même si le garbage collector coup de pied dans et supprimé le fichier de session que vous avez ouvert/lu avec
session_start()
, il n'atteindra PAS dans les détails de ce processus PHP et supprimer les$_SESSION
tableau d'objets.En supposant que vous êtes sur le fichier standard de base gestionnaire de session (qui contient une
serialize()
'd la copie de$_SESSION
), voici ce qui se passe.session_start()
, provoquant PHP pour ouvrir/verrouiller le fichier, lire son contenu, désérialiser les données, et d'ailleurs, éventuellement mettre à jour le fichier de session du "dernier" timestamp (atime sur Unix, des boîtes).Maintenant, si vous avez fait quelque chose comme ceci:
Maintenant, vous pourriez finir avec un nouveau vide $_SESSION, SI le garbage collector décide de coup de pied dans. Cependant, à moins que la deuxième
session_start()
, la vieille $_SESSION les données de la dernière start() appel SERA TOUJOURS PRÉSENTE. Le fichier de session peut avoir été saccagé, mais le garbage collector ne sera pas toucher à ce qui est présent dans votre script de mémoire, car il fonctionne.session_start()
remplit la$_SESSION
tableau? Avez-vous une URL qui le confirme?session_write_close()
bonne idée!session_write_close()
mise à jour le atime du fichier? Ensuite, la deuxièmesession_start()
ne laisserais jamais la GC supprimer le fichier.session.gc_maxlifetime est le nombre de secondes après lequel la session sera considéré comme pour la collecte des ordures.
session.gc_probability et de la session.gc_divisor puis de déterminer la probabilité que la collecte des ordures sera exécuté sur toute l'initialisation de la session
Lire la manuel (l'emphase est mienne):
Dans la même page:
Maintenant faire le calcul et voir que ce n'est pas très probable que le GC sera appelée à chaque demande.
Vous devez les stocker dans la session une variable qui permet d'économiser le temps de la dernière activité de l'utilisateur et de l'utiliser à la place de la session est logiquement "active". Ne comptez pas sur la collecte des ordures.
session_start
.Je ne pense pas que c'est de cette façon
gc_maxlifetime
est censé fonctionner. Le manuel dit(l'emphase est mienne)
dans votre cas, la session est toujours active. Donc, je ne pense pas qu'il sera soumis à la collecte des déchets.
Vous pourriez essayer de faire un
session_write_close()
avant le sommeil(). Qui pourrait augmenter la probabilité que le garbage collector.session_start
.$_SESSION
valeur avec un timbre de temps, de la mise à jour sur chaque demande, et de vérifier si la valeur de session et l'heure actuelle sont de plus de x secondes d'intervalle.