2010-08-06 2 views
16

Die PHP-Skript ist wie folgt:PHP - ini_set ('session.gc_maxlifetime', 5) - Warum wird die Sitzung nicht beendet?

<?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."; 

?> 

auf dem Timeout Basierend (d.h. 5 Sekunden), sollte das Skript nichts ausdrucken. Allerdings erhalte ich immer noch die folgende Meldung

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

Es scheint, dass die Linie ini_set (‚session.gc_maxlifetime‘, 5) nicht funktioniert, wie es sein sollte. Ich verwende WindowsXP + XAMMP.

Können Sie mir sagen, wie es funktioniert?

Danke

Antwort

4

Lesen Sie die manual (Hervorhebung von mir):

session.gc_maxlifetime die Anzahl der Sekunden, nach der angibt, werden die Daten als ‚Müll‘ zu sehen und möglicherweise gereinigt. Die Speicherbereinigung kann während des Starts der Sitzung erfolgen (abhängig von session.gc_probability und session.gc_divisor).

in der gleichen Seite:

session.gc_divisor gekoppelt mit session.gc_probability definiert die Wahrscheinlichkeit, dass der gc (garbage collection) Prozess auf jeder Sitzung Initialisierung gestartet wird. Die Wahrscheinlichkeit wird unter Verwendung von gc_probability/gc_divisor, z.B. 1/100 bedeutet, dass eine Wahrscheinlichkeit von 1% besteht, dass der GC-Prozess bei jeder Anforderung gestartet wird. session.gc_divisor standardmäßig auf 100.

tun nun die Mathematik und sehen, dass es nicht sehr wahrscheinlich, dass der GC wird bei jeder Anfrage aufgerufen werden.

Sie sollten in der Sitzung eine Variable speichern, die die Zeit der letzten Aktivität des Benutzers speichert und diese anstelle der Sitzung logisch "aktiv" verwendet. Verlassen Sie sich nicht auf die Garbage Collection.

+0

Ich denke, der Punkt hier ist, dass die Sitzung immer noch aktiv ist, und sollte daher wahrscheinlich nicht auf jeden Fall der Garbage Collection unterzogen werden. Ich weiß es nicht genau. –

+0

@Pekka Der Punkt ist, dass die Garbage Collection hier nutzlos ist, weil 1) sie nur mit einer kleinen Wahrscheinlichkeit aufgerufen wird und 2) sie nur bei 'session_start' aufgerufen wird. – Artefacto

+0

vereinbart. Außerdem ist die Garbage Collection noch nutzloser, da die Sitzung, in der wir uns befinden, immer noch aktiv ist (und einige interne Handler vermutlich gesperrt sind). Richtig? –

1

Ich glaube nicht, dass so funktioniert gc_maxlifetime soll funktionieren. Das Handbuch sagt

session.gc_maxlifetime die Anzahl der Sekunden angibt, nach denen Daten als ‚Müll‘ zu sehen sein wird und potenziell gereinigt.

(Hervorhebung von mir)

in Ihrem Fall ist die Sitzung noch aktiv. Daher denke ich nicht, dass es einer Müllsammlung unterliegen wird.

Sie könnten versuchen, eine session_write_close() vor dem Schlaf(). Das könnte die Wahrscheinlichkeit des Garbage Collectors erhöhen.

+0

Er hatten wir die gleiche Idee auf die Betonung: p – Artefacto

+0

@Artefacto ja, wie lustig! :) –

+0

Hallo alle, Ich habe die folgenden Zeilen hinzugefügt, aber es funktioniert immer noch nicht. ini_set ('session.gc_maxlifetime', 5); ini_set ('gc_probability', 100); ini_set ('gc_divisor', 100); was ich tun möchte, ist die Erzwingung der Sitzung automatisch nach 5 Sekunden abgelaufen. Wenn diese Methode nicht funktioniert, wie funktioniert es? danke – q0987

9

session.gc_maxlifetime ist die Anzahl der Sekunden, nach der die Sitzung betrachtet für die Garbage Collection sein wird.

Sitzung.gc_probability und session.gc_divisor dann bestimmen die Wahrscheinlichkeit, dass die Garbage Collection wird auf jeder Sitzung Initialisierung

34

Auch wenn der Garbage Collector in und gelöscht Sie die Sitzungsdatei trat ausgeführt werden geöffnet/gelesen mit session_start(), wird es nicht in die Eingeweide erreichen von diese bestimmte PHP-Prozess und löschen Sie die $_SESSION Objekt-Array.

Angenommen, Sie befinden sich im standardmäßigen dateibasierten Session-Handler (der eine 'd Kopie von $_SESSION enthält), was passiert.

  1. Die Sitzungsdatei sitzt in seinem temporären Verzeichnis
  2. Sie session_start(), PHP verursacht zu öffnen/sperren Sie die Datei, lesen Sie dessen Inhalt, die Daten deserialisiert, und nebenbei bemerkt, möglicherweise aktualisieren Sie die Sitzung Datei „zuletzt verwendete“ Zeitstempel (atime auf Unix-Boxen).
  3. Wenn die Sterne und Mond korrekt mit Neptun Aszendent im fünften Haus ausgerichtet sind, die Sitzung Garbage Collector MAY feuern und löschen alte Sitzungsdateien.
  4. Der Garbage Collector wird gerne durch das Sitzungsverzeichnis iterieren und alle Dateien löschen, die älter sind als die max_liftime, , aber keine Dateien löschen derzeit. Da Sie Ihre Sitzung nicht geschlossen haben(), wird die Datei Ihrer Sitzung noch immer verwendet und nicht gelöscht.

Nun, wenn Sie so etwas wie dies tun:

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; 

Nun könnte man nur mit einem am Ende frisch blank $ _SESSION, IF die Garbage Collector zu treten entscheidet jedoch, es sei denn, Sie. tun, dass zweite session_start(), die alten $ _SESSION Daten aus dem vorherigen start() Anruf wird noch vorhanden sein. Die Sitzungsdatei wurde möglicherweise gelöscht, aber der Garbage Collector wird nicht berühren, was im Speicher des Skripts vorhanden ist, während es ausgeführt wird.

+2

Sind Sie sicher, dass der Garbage Collector nicht ausgeführt wird * bevor * 'session_start()' das '$ _SESSION' Array auffüllt? Haben Sie eine URL, die dies bestätigt? –

+3

+1 für # 3 und für 'session_write_close()' gute Idee! –