Moin!
- Die Garbage-Collector-Methode des Session-Handlers löscht alte Datenbank-Einträge erst nach 30 Stunden anstatt 30 Minuten (d.h. nach [eingestellte Zeit in Minuten] * 60). Das ist nicht nur Zufall: Über SHOW PROCESSLIST habe ich schon ein paar mal die Anfrage "... INTERVAL 1800 MINUTE ..." (30 * 60 = 1800) vom Garbage-Collector entdeckt. Wenn ich die Methode Session::_gc() aber "von Hand" aufrufe, steht im Datenbank-Query - wie erwünscht - "... INTERVAL 30 MINUTE ...".
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.
Bei unglücklicher Zufallsverteilung und geringer Zahl von Requests kann es also durchaus lange Zeit dauern, bis die Garbage Collection mal wieder gestartet wird.
Das gilt auch dann, wenn du eigene Routinen installiert hast.
- 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.
1. Du stellst nirgendwo in deinem Session-Objekt sicher, dass es über eine funktionierende DB-Verbindung verfügt. Sinnvoll wäre, dem Objekt ein DB-Singleton zu übergeben, mit dem im Bedarfsfall die Verbindung hergestellt wird, andernfalls die bestehende Verbindung genutzt wird.
2. Dein Escaping ist zwar vorhanden, nutzt aber dein DB-Objekt ebenfalls nicht. Dabei ist das Escaping abhängig von der gewählten Connection bzw. genauer gesagt der dort genutzten Zeichencodierung. $db->real_escape_string() wäre angesagt (sofern $db eine Instant von mysqli ist).
- Sven Rautenberg
"Love your nation - respect the others."