Thread CGI::Session - Wie löscht man expired sessions?? (8 answers)
Opened by jan10001 at 2003-12-14 13:16

Gast Gast
 2003-12-14 08:45
#501 #501
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

View full thread CGI::Session - Wie löscht man expired sessions??