2010-08-06 13 views
16

PHP est comme suit:PHP - ini_set ('session.gc_maxlifetime', 5) - Pourquoi ça ne met pas fin à la session? Le script

<?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 (à savoir 5 secondes), le script ne doit pas imprimer quoi que ce soit. Cependant, je reçois toujours le message

5Welcome back Bill. Your full name is Bill Smith. Your username is 'bsmith' and your password is 'mysecret'. 

suivante Il semble que la ini_set ligne (« session.gc_maxlifetime », 5) ne fonctionne pas comme il devrait être. J'utilise WindowsXP + XAMMP.

Pouvez-vous me dire comment le faire fonctionner?

Merci

Répondre

4

Lire la (Souligné par l'auteur) manual:

session.gc_maxlifetime indique le nombre de secondes, après quoi les données seront considérées comme des « déchets » et potentiellement nettoyer vers le haut. La récupération de place peut se produire pendant le démarrage de la session (en fonction de session.gc_probability et session.gc_divisor).

Dans la même page:

session.gc_divisor couplé avec session.gc_probability définit la probabilité que le processus de gc (collecte des ordures) est démarrée à chaque initialisation de la session. La probabilité est calculée en utilisant gc_probability/gc_divisor, par ex. 1/100 signifie qu'il y a 1% de chance que le processus GC commence sur chaque requête. session.gc_divisor par défaut 100.

Maintenant, faites le calcul et voir qu'il est peu probable que le GC sera appelé à chaque demande.

Vous devez stocker dans la session une variable qui enregistre l'heure de la dernière activité de l'utilisateur et l'utiliser à la place de la session est logiquement "active". Ne comptez pas sur la collecte des ordures.

+0

Je pense que le point ici est cependant que la session est toujours active, et ne devrait donc probablement pas être sujet à la garbage collection dans tous les cas. Je ne sais pas pour sûr cependant. –

+0

@Pekka Le point est que le garbage collection est inutile ici parce que 1) il sera seulement appelé avec une petite probabilité et 2) il est seulement appelé sur «session_start». – Artefacto

+0

convenu. De plus, la récupération de place est encore plus inutile car la session dans laquelle nous sommes est toujours active (et un gestionnaire interne probablement verrouillé). Correct? –

1

Je ne pense pas que c'est ainsi que gc_maxlifetime est censé fonctionner. Le manuel dit

session.gc_maxlifetime indique le nombre de secondes, après quoi les données seront considérées comme « déchets » et potentiellement nettoyé.

(Souligné par l'auteur)

dans votre cas, la session est toujours active. Par conséquent, je ne pense pas qu'il sera sujet à la collecte des ordures.

Vous pouvez essayer de faire un session_write_close() avant le sleep(). Cela pourrait augmenter la probabilité que le garbage collector.

+0

Il nous avons eu la même idée sur l'emphase: p – Artefacto

+0

@Artefacto ouais, comme c'est drôle! :) –

+0

Bonjour à tous, J'ai ajouté les lignes suivantes, mais cela ne fonctionne toujours pas. ini_set ('session.gc_maxlifetime', 5); ini_set ('gc_probability', 100); ini_set ('gc_divisor', 100); Ce que je veux faire est d'appliquer la session expirée automatiquement après 5 secondes. Si cette méthode ne fonctionne pas, comment le faire fonctionner? merci – q0987

9

session.gc_maxlifetime est le nombre de secondes, après quoi la session sera considéré pour la collecte des ordures.

session.gc_probability et session.gc_divisor ensuite déterminer la probabilité que la collecte des ordures sera exécuté sur une initialisation de la session

34

Même si le garbage collector lancé et supprimé le fichier de session que vous avez ouvert/lu avec session_start(), il ne sera pas atteindre dans les entrailles de ce processus PHP particulier et supprimer le tableau objet $_SESSION.

En supposant que vous utilisez le gestionnaire de session standard basé sur des fichiers (qui contient une copie serialize() d de $_SESSION), voici ce qui se passe.

  1. Le fichier de session se trouve dans son répertoire temp
  2. Vous session_start(), ce qui provoque PHP pour ouvrir/verrouiller le fichier, lire son contenu, désérialiser les données, et accessoirement, mettre à jour éventuellement horodatage « Dernière utilisation » du fichier de session (une fois sur les boîtes Unix).
  3. Si les étoiles et la lune sont alignées correctement avec Neptune ascendant dans la cinquième maison, le ramasse-miettes de session MAY démarre et supprime les anciens fichiers de session.
  4. Le ramasse-miette itera heureusement dans le répertoire de session, et supprimera tous les fichiers qui sont plus anciens que le max_liftime, MAIS NE SUPPRIMERA PAS LES FICHIERS ACTUELLEMENT OUVERTS. Puisque vous n'avez pas fermé() votre session, le fichier de votre session est toujours utilisé, donc il ne sera pas supprimé.

Maintenant, si vous avez fait quelque chose comme ceci:

ini_set(...); // set GC probability to max, short session lifetime, etc... 

session_start(); // populate $_SESSION 
session_write_close(); // dump $_SESSION out to file, close file, release lock. 

sleep(7); // Sleep for 7 seconds; 

session_start(); // re-populate $_SESSION; 

Maintenant, vous pourriez finir avec un nouveau blanc _SESSION $, SI le garbage collector décide de lancer en Cependant, à moins que vous. faire ce deuxième session_start(), les anciennes données $ _SESSION de l'appel start() précédent sera toujours présent. Le fichier de session a peut-être été saccagé, mais le garbage collector ne touchera pas ce qui est présent dans la mémoire de votre script pendant son exécution.

+2

Etes-vous sûr que le garbage collector ne fonctionne pas * avant * 'session_start()' remplit le tableau '$ _SESSION'? Avez-vous une URL qui confirme cela? –

+3

+1 pour # 3 et pour 'session_write_close()' bonne idée! –