# session.gc_maxlifetime Sessiondatei



## newbi_1 (12. Februar 2008)

Hallo,
ich habe eine kleine Anzahl von Anwendern, die mein entwickeltes Programm benutzen. Die Anwender wollen die Anwendung den ganzen Tag offen halten. Ich arbeite mit Sessions.
Es tritt folgender Fehler auf: Die Anwender lassen den Browser offen und arbeiten nach einer Stunde weiter. Sie geben Text in eine Maske ein und wollen in die Datenbank abspeichern. Das funktioniert nicht, weil die 'session.gc_maxlifetime' auf 24 min eingestellt ist. Der Bildschirm wird weiß. 
Um den Fehler zu beheben, reicht es dazu aus die session.gc_maxlifetime einfach höher zu setzen? Spricht denn aus Sicherheitsgründen etwas dagegen? 
Was ist wenn die Netzwerkverbindung kurz unterbrochen ist?
Ich habe soviel in Foren nachgelesen, aber darauf keine Antwort gefunden. 
Ich habe Zugriff auf den Server, kann also alle php.ini Parameter verändern.
Danke im voraus


----------



## Gumbo (12. Februar 2008)

Der Garbage Collector (dafür steht das „gc“) sorgt nur dafür, dass Sitzungsdaten nicht den Server vollmüllen. Der Standardwert von 24 Minuten bezeichnet dabei, nach welcher Zeitspanne seit der letzten Änderung dieser Sitzung die Sitzungsdaten als „nicht mehr benötigt“ endgültig entfernt werden können.
Wenn du also möchtest, dass diese Zeitspanne größer ist, musst du einfach den Wert erhöhen. Die Sicherheit beschränkt diese Veränderung nur in dem Sinne, dass die Sitzungs-ID dadurch länger „gültig“ ist. Du solltest sie also in regelmäßigen Abständen durch eine neue ersetzen.


----------



## newbi_1 (12. Februar 2008)

Danke vielmals,

aber wie erneuere ich die Sitzungs-ID?

Bin eben ein Anfänger


----------



## Gumbo (12. Februar 2008)

Die session_regenerate_id()-Funktion macht das. Dafür musst du dir aber den Zeitpunkt der Initialisierung der Sitzung speichern, beispielsweise:
	
	
	



```
session_start();
if( !isset($_SESSION['CREATED']) || time()-$_SESSION['CREATED'] > 1440 ) {
	// Sitzung wurde nicht durch Server initialisiert oder
	// Sitzungs-ID ist bereits älter als 1440 Sekunden
	session_regenerate_id(true);
	$_SESSION['CREATED'] = time();
}
```


----------



## newbi_1 (13. Februar 2008)

Hallo netter Helfer,
ich hab nun ein bisschen herumprobiert.

Beim login eines Anwenders mache ich also ein

```
session_start();
$_SESSION['CREATED'] = time();
```


Die Sessiondatei wird angelegt und bleibt stehen bis der gb diese löscht oder der Anwender ein logout macht.

beim Aufruf anderer php-Module setzte ich immer deinen Code ein

```
session_start();
if( !isset($_SESSION['CREATED']) || time()-$_SESSION['CREATED'] > 1440 ) {
    // Sitzung wurde nicht durch Server initialisiert oder
    // Sitzungs-ID ist bereits älter als 1440 Sekunden
    session_regenerate_id(true);
    $_SESSION['CREATED'] = time();
}
```
und beim Ausloggen ein 

```
session_destroy();
```
Dann ist die Session aus dem /var/tmp Verzeichnis gelöscht.


Aber woher weiss das Programm welche Sessiondatei regeneriert werden soll, das verstehe ich noch nicht. Es stehen im /var/tmp mehrere Sessiondateien von mehreren Usern drin. Und leider loggen sich die Anwender nicht aus sondern schließen nur den Browser.

Vielen Dank nochmal


----------



## Gumbo (13. Februar 2008)

Der von mir genannte Algorithmus reicht ist so komplett. Gerade dass nicht bei jedem Aufruf der „Created“-Wert aktualisiert wird, sorgt dafür, dass die Sitzungs-ID in regelmäßigen Abständen aktualisiert wird. Dazu ist es allerdings notwendig, dass, falls die Sitzungs-ID per Cookie übergeben wird, der Cookie eine entsprechend längere Lebenszeit als die in dem Skript angegebene maximale Lebenszeit der Sitzungs-ID.


----------



## suerte (14. Juli 2008)

Hey,

schon mal sehr informativ.
jedoch habe ich das problem das ich nicht an die php.ini ran komme da Funpic.de server.
dort ist eine zeit von 1200 für max_liftime definiert. sprich ich müsste nach 20 min rausfliegen.

also ich log ich auf meiner seite ein, starte eine session mit session_start() und rufe diese funktion natürlich auf allen seiten auf, bei denen ich die session informationen brauche. also z.B. $_SESSION['username']. 
nach ca. 10-15 min habe ich keinen zugrif mehr auf dieses feld bzw. es ist leer. Nun ist natürlich meine frage warum das 1. vor den 20 min passiert und 2. warum das passiert ohne zu idlen. dachte das ich erst nach 20 min idle rausfliege.
nun meine nächste frage, wie ich das problem beheben kann.  danke

das sind die daten die in der php.ini drin stehen

session.gc_divisor 100 
session.gc_maxlifetime 1200 
session.gc_probability 0


nachtrag, habe eben noch einmal getestet.ich logge mich ein starte session_start() und rufe dann per hand und dem reload button städig die menu.php auf in der folgendes steht 

....
session_start();
$AnsiString='Select * From person Where username='.$_SESSION['username'].';
//DATENBANK ABFRAGE
....
ausgabe

das funktioniert und die abfrage verläuft korrekt. nach so ca. 30 - 40 reload's ca. 1,5 min, habe ich keinen zugriff mehr auf $_SESSION['username'] obwohl die session ja noch vorhanden sein müsste aber leider keinen zugriff mehr auf $_SESSION['username']. woran könnte das liegen?


----------

