Hallo,
Das ist normal.
Die Garbage Collection wird im Prinzip bei jedem PHP-Request mit Session-Beteiligung aufgerufen, allerdings reduziert durch einen Zufallsfaktor. Standardeinstellung ist 1/100, also nur durchschnittlich jeder hunderste Aufruf eines PHP-Skripts mit Session-Funktion räumt alte Session-Daten auf.
Das ist mir bekannt. Darum handelt es sich hier aber nicht. Ich habe die Anfrage (zufällig) in der MySQL-Prozessliste erwischt (ab und zu mal). Da stand jedes mal "DELETE FROM sessions WHERE last_access ... INTERVAL 1800 MINUTE" (anstatt ... INTERVAL 30 MINUTE). D.h. selbst wenn die gc_probability 100% wäre, würden nur alles, was älter ist als 30 Stunden gelöscht werden. Außerdem beobachte ich das schon eine ganze Weile: Der älteste Datensatz war meistens gut 30 Stunden alt (wie du schon sagst, je nach Zufallsverteilung auch mal etwas mehr, vielleicht 40 Stunden) - nie aber unter 30 Stunden. Das alleine könnte ich mir durch eine ungünstige Verteilung nicht mehr erklären ;). Also es ist fast so, als ob durch die Zeile
ini_set('session.gc_maxlifetime', (int)SESSION_LIFETIME*60);
der Wert der Konstanten SESSION_LIFETIME selbst mit 60 multipliziert wird (und dieser neue Wert dann eben wieder als Konstante gespeichert wird), so dass letztendlich nicht 30, sondern 30 * 60 = 1800 an den Garbage Collector übergeben wird. An so etwas liegt es aber auch nicht, da, wenn ich die Funktion Session::_gc() normal im Skript aufrufe (und wenn das nicht über den Session-Handler geschieht), die Anfrage richtig mit der Zahl 30 (und nicht 1800) ausgeführt wird.
Hat irgendjemand eine Ahnung, wie so etwas sein kann?
- Sporadisch tritt die Fehlermeldung "Notice: Object of class mysqli_result could not be converted to int in [...]index.php on line 85" auf.
Deine Konstruktion ist in zwei Punkten kritikwürdig.
Da hast du Recht, danke für die Tipps. Die Fehlermeldung allerdings ist wohl nicht darauf zurückzuführen, oder irre ich? Woran könnte das sonst liegen?
Gruß,
Günther