Thread CGI::Session - Wie löscht man expired sessions??
(8 answers)
Opened by jan10001 at 2003-12-14 13:16
Hallo!
Wenn ich mit Session's arbeite verwende ich das Modul CGI::Session, bzw. um genau zu sein das Modul CGI::Session::MySQL. Die Sessions werden in die Tabelle "sessions" geschrieben und die Tabelle sessions wird mir von der offiziellen Doku vorgeschrieben: CREATE TABLE sessions ( id CHAR(32) NOT NULL UNIQUE, a_session TEXT NOT NULL ); Wenn ich nun ein Perl-Script habe welches eine Session erzeugt, wird die ganze "Variablen-Wurst" in MySQL eingetragen (in das Feld "a_session) In meinem Test-Script habe ich die Expiration auf 3 Sekunden gesetzt. Wenn ich ein Session-Test-Script von mir aufrufe mit einer abgelaufenen Session-ID dann bekomme ich aus der session keine Daten mehr raus, und die Session wird in der MySQL tabelle umbenannt und die alten werte die gesetzt wurden werden gelöscht. Somit bleibt es beim gleichen User immer eine gleiche ID-Anzahl in der DB. Das Problem faengt hier an: Ein User loggt sich auf der Seite ein und schließt irgendwann einfach den Browser oder seine Internet-Verbindung reißt ab oder .... jedenfalls loggt er nicht korrekt aus... Also habe ich keine Möglichkeit mit delete die session zu killen, und die Session wird mit "expire" beendet. Und: Dann bleibt diese Session in der Datenbank gespeichert!! Und genau DAS ist das Problem! Ich kann davon ausgehen dass 90% der User nicht auf "logout" klicken werden sondern einfach den Browser schließen werden. Diese Sessions werden von CGI::Session nicht gelöscht, und bleiben alle in der DB ! Ich habe gehofft dass die abgelaufenen Sessions alle mal irgendwie gelöscht werden von MySQL aber in meiner Datenbank sind nun schon 1400 abgelaufene Session's und die werden anscheinend niemals gelöscht wenn sie nur expire'n und nicht mit delete gelöscht werden. Und delete bringt mir ja nichts weil es .. eben expire sein soll *g* Das selbe Problem tritt auf wenn ich nicht das MySQL-Modul von CGI::Session nehme sondern das normale CGI::Session welches alles in Datafiles speichert. Da passiert exakt das selbe..... Frage: Wie löse ich dieses Problem? Eine Idee: Es waere denkbar ein Perlscript zu schreiben das man einmal am Tag laufen laesst und das alle abgelaufenen Sessions auffindet und den entsprechenden Session-Eintrag dann aus der DB löscht. Das Problem ist aber dass keine Zeitangabe von expire in einem extra feld steht, sondern die gesagte query-wurst in einem einzigen MySQL-Feld ist (a_session) Somit kann ich nichtmal nach abgelaufenen Sessions suchen. Und bei den Datafiles gehts ja auch nicht .... Bitte sagt mir wie ich die nicht mehr aktives ID-Eintraege in der MySQL Datenbank loswerden soll bzw. die abgelaufenen Datafiles löschen soll..... Es sollte auf jeden fall eine Sinnvolle lösung sein und nicht im Stil von "sind 1000 eintrage da einfach 500 löschen)... Das waere z.B. eine schlechte Lösung =) Danke! Aqua |