User since
2003-08-14
962
Artikel
BenutzerIn
Ich denke das dürfte die Antwort sein.
Quoteexpire()
expire($time)
expire($param, $time)
Sets expiration date relative to atime(). If used with no arguments, returns the expiration date if it was ever set. If no expiration was ever set, returns undef.
Second form sets an expiration time. This value is checked when previously stored session is asked to be retrieved, and if its expiration date has passed will be expunged from the disk immediately and new session is created accordingly. Passing 0 would cancel expiration date.
By using the third syntax you can also set an expiration date for a particular session parameter, say "~logged-in". This would cause the library call clear() on the parameter when its time is up.
User since
2003-08-14
962
Artikel
BenutzerIn
Wenn ich das richtig verstanden, bekommt man mit expire() das Verfallsdatum. Folglich müßte dein Script einmal am Tag alle DB Einträge auslesen, prüfen und die betreffenden Sessions mit delete löschen.
User since
2003-08-04
5246
Artikel
ModeratorIn
ich habe das Modul CGI::Session nicht im Kopf, aber koennte man das nicht so umschreiben, dass es auch das expires in eine neue Spalte der Datenbank schreibt? Dann kannst du die alten IDs von Zeit zu Zeit loeschen (z.B. durch einen cronjob). Sagt
CGI::Session::Tutorial oder
CGI::Session::Cookbook was dazu?
User since
2003-08-14
962
Artikel
BenutzerIn
Dann erweitere die DB Tabelle um eine Spalte die du als Timestamp setzt. Der Vorteil von MySQL Timestamp ist der das bei jeder Änderung der Zeitstempel automatisch aktualisiert wird. Diesen Zeitstempel kannst du dann benutzen um die betreffenden Sessions zu finden.
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
User since
2003-12-14
3
Artikel
BenutzerIn
Hallo jan!
Genau das ist ja das Problem dass mit expire zwar die Session
unbrauchbar macht aber die Zeile (row) aus der MySQL
Datenbank nicht rauslöscht!!
LG
Aqua
User since
2003-12-14
3
Artikel
BenutzerIn
Das kann ich aber nicht einfach so checken,
dafür muss ich zuerst mit der Session-ID ein
neues CGI::Session Objekt erzeugen.
Und das für jede der Sessions - Aufwaendig
Bitte teste das mal durch,
ich glaube das geht nicht...
Danke
User since
2003-12-14
3
Artikel
BenutzerIn
hi
Daran dachte ich auch schon,
aber eine etwas "offiziellere" Art und Weise waere mir doch lieber
weil das dann getesteter sein würde....
So mit dem umschreiben ... wenn ich da was übersehe...
LG
Aqua
User since
2003-08-04
5872
Artikel
ModeratorIn
Mir scheint, dies ist doch stark CGI- bzw. DB-lastig, ich verschiebe den Thread mal entsprechend...
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;
use strict; use warnings; Link zu meiner Perlseite