Sessions beenden (Perl)
Markus Trusk
- programmiertechnik
Hola,
ich habe mich seit kurzem damit beschäftigt, wie ich am besten Sessions realisieren kann. Im Prinzip ist es ja nichts anderes als ein Hash, wobei die SessionID der Hashname, die Variablen die Schlüsseln und die Werte der Variablen die Werte sind. Jetzt frage ich mich aber, wie ich es am besten realisieren kann, dass Sessions nach einer gewissen Zeit gelöscht werden? (zB wenn sich bei dieser Session 5 Minuten lang nichts mehr tut). Ich will eigentlich versuchen, möglichst ohne zusätzliche Module auszukommen. (Apache::Session habe ich für Windows gar nicht gefunden, geschweige denn kann man verlangen, dass es bei anderen Usern installiert ist). Cronjobs möchte ich auch nicht gerade sehr gerne verwenden, da man ja auch nicht verlangen kann, dass jeder Cronjobs zur Verfügung hat, also wie kann man so ein Problem am besten angehen?
Markus Trusk.
Gleich, nachdem Du Dir die dafür nötige Zeit genommen hast um MySQL wenigstens grundlegend zu verstehen, kannst Du Dir unter Zuhilfenahme der Datenbank leicht selbst eine Session-Lösung stricken.
Bring doch erst mal Dein Problem in [pref:t=70100&m=403586] auf die Reihe und gehe dann die nächstenen 10 Schritte weiter.
Ach so. Ich habe auf eine ganz schlechte Antwort von Dir verlinkt. Du musst Dir die Zeit nehmen.
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix®
Ob ich mich jetzt um mehrere Sachen gleichzeitig kümmere, ist wohl meine Sache. Außerdem geht es mir hier nur um eine Programmlogik und nicht in diesem Fall um ein mySQl Problem. Außerdem will ich so wenig andere Technologie miteinbeziehen als möglich, wie ich schon sagte.
Markus Trusk.
Hallo Markus,
[...] wobei die SessionID der Hashname, [...]
Oha, das wuerde ich mir ja überlegen.
Jetzt frage ich mich aber, wie ich es am besten realisieren kann,
dass Sessions nach einer gewissen Zeit gelöscht werden?
Die Cleanup-Routine prüft auf erloschene Session-Dateien und löscht
diese Notfalls. Bei einem wenig besuchten Webauftritt liegen dann
zwar schonmal ein paar Tage alte Sessions rum, aber was solls. Bei
nicht sicherheitsrelevanten Anwendungen ist das nicht so wichtig.
Grüße,
CK
Hola,
[...] wobei die SessionID der Hashname, [...]
Oha, das wuerde ich mir ja überlegen.
warum das? Kannst du mir das genauer erklären?
Jetzt frage ich mich aber, wie ich es am besten realisieren kann,
dass Sessions nach einer gewissen Zeit gelöscht werden?
Die Cleanup-Routine
Wie würde diese aussehen?
Ich habe mich übrigens nach dieser Seite orientiert:
http://www.usegroup.de/software/phptutorial/sessions.html
Ist zwar ein PHP Tut., aber ich wollte ja eigentlich nur die Technik von Sessions verstehen.
Markus Trusk.
Hallo Markus,
[...] wobei die SessionID der Hashname, [...]
Oha, das wuerde ich mir ja überlegen.
warum das? Kannst du mir das genauer erklären?
Ich würde nicht irgendwelche Variablen in den globalen Namensbereich
importieren wollen, nein, wirklich nicht.
Jetzt frage ich mich aber, wie ich es am besten realisieren
kann, dass Sessions nach einer gewissen Zeit gelöscht werden?Die Cleanup-Routine
Wie würde diese aussehen?
use contant SESSION_TIMEOUT => 5 * 60;
sub new_session {
# blahr
cleanup();
}
sub destroy_session {
# blahr
cleanup();
}
sub cleanup {
my $time = time;
opendir DIR,'sessiondir' or die $!;
my @session_files = grep /^perlsess_/, readdir DIR;
closedir DIR;
foreach my $sess_file (@session_files) {
unlink('sessiondir/'.$sess_file) if (stat('sessiondir/'.$sess_file))[9] < $time + SESSION_TIMEOUT;
}
}
Grüße,
CK
Hi,
Ich würde nicht irgendwelche Variablen in den globalen Namensbereich
importieren wollen, nein, wirklich nicht.
Also ehrlich gesagt verstehe ich jetzt die Problematik hierbei nicht?
zB $hd73gh58fgh43djkt{vorname} = 'markus';
$hd73gh58fgh43djkt{wohnort} = 'wien';
Diese Zuweisungen passieren doch nur im Script, ohne das irgendjemand weiß, was da alles hinzugefügt wird oder ausgelesen wird?
use contant SESSION_TIMEOUT => 5 * 60;
sub new_session {
# blahr
cleanup();
}
sub destroy_session {
# blahr
cleanup();
}
sub cleanup {
my $time = time;
opendir DIR,'sessiondir' or die $!;
my @session_files = grep /^perlsess_/, readdir DIR;
closedir DIR;
foreach my $sess_file (@session_files) {
unlink('sessiondir/'.$sess_file) if (stat('sessiondir/'.$sess_file))[9] < $time + SESSION_TIMEOUT;
}
}
Hmmm, das mit dem constant Modul muss ich mir noch genauer ansehen.
Markus Trusk.
Hallo Markus,
Also ehrlich gesagt verstehe ich jetzt die Problematik hierbei
nicht?
zB $hd73gh58fgh43djkt{vorname} = 'markus';
$hd73gh58fgh43djkt{wohnort} = 'wien';
Diese Zuweisungen passieren doch nur im Script, ohne das
irgendjemand weiß, was da alles hinzugefügt wird oder ausgelesen
wird?
script?sid=<bel. varname>
Grüße,
CK
Hi,
script?sid=<bel. varname>
Da hast du allerdings recht :) Dann schicke ich eben jedesmal eine selbignamige ID statt dem Hash durch das Script, also script?SESSIONID=af56sw5f56de5f. Der Hash würde dann den selben Namen wie die ID haben, aber der Vorteil wäre jetzt natürlich, dass man dieser ID nichts mehr anhängen kann, da sonst der Hash nicht mehr erkannt werden würde, oder gäbe es da jetzt noch irgendeine Lücke, an die ich nicht gedacht habe?
Markus Trusk.
Hallo Markus,
script?sid=<bel. varname>
Da hast du allerdings recht :)
Schoen, dass du das auch so siehst ;)
Dann schicke ich eben jedesmal eine selbignamige ID statt dem Hash
durch das Script, also script?SESSIONID=af56sw5f56de5f.
Der Hash würde dann den selben Namen wie die ID haben, aber der
Vorteil wäre jetzt natürlich, dass man dieser ID nichts mehr
anhängen kann, da sonst der Hash nicht mehr erkannt werden würde,
oder gäbe es da jetzt noch irgendeine Lücke, an die ich nicht
gedacht habe?
Warum machst du es dir so kompliziert? Benutze die Session-ID als
Identifier für die Session-Datei (z. B. Dateiname = "perlsess_" +
Session-ID) und benutze für den Session-Hash einfach nur $session
oder so. Dann hast du keinerlei Probleme, die man nicht überblicken
könnte.
Grüße,
CK
Hi,
vielleicht wäre sogar CGI::Session die Lösung. Ich habe es mal installiert, und ein bißchen herumexperimentiert, aber eines ist mir noch nicht so ganz klar. Ich kann zwar Sessions erzeugen, aber wie bekomme ich aus einer bestimmten Session die Daten wieder heraus?
Ich hasse diese cpan Erklärungen jedesmal dafür. Da steht zB:
my $f_name = $session->param('f_name');
my $l_name = $session->param(-name=>'l_name');
Ok gut. Das funktioniert natürlich so lange, wie ich die ersten Zeilen (darunter) stehen lasse, aber das erzeugt immer neue Sessions. Geschweige denn finde ich irgendwo die Zeile, die beinhaltet, wie ich über die ID auf eine Session zugreife.
my $session = new CGI::Session(driver::File, undef, {Directory=>'/temp'});
my $CGISESSID = $session->id();
Wenn ich sie entferne, wie soll ich dann $session deklarieren?
Markus Trusk.
Hi,
ich habe mich seit kurzem damit beschäftigt, wie ich am besten Sessions realisieren kann.
ist ja auch interessant.
Im Prinzip ist es ja nichts anderes als ein Hash, wobei die SessionID der Hashname, die Variablen die Schlüsseln und die Werte der Variablen die Werte sind.
Oder auch ein Datensatz, der zu persistieren ist?
Jetzt frage ich mich aber, wie ich es am besten realisieren kann, dass Sessions nach einer gewissen Zeit gelöscht werden? (zB wenn sich bei dieser Session 5 Minuten lang nichts mehr tut).
Mein Vorschlag: Sessions nicht loeschen, sondern beim Datenzugriff pruefen, ob die Session ausgetimt ist. (Unabhaengig davon einen Job einrichten, der in einem regelmaessigen Zeitabstand ausgetimte Sitzunge loescht. Also trennen, was zu trennen ist. ("Nicht zusammenwachsen lassen, was nicht zusammen gehoert." ;-))
Ich will eigentlich versuchen, möglichst ohne zusätzliche Module auszukommen. (Apache::Session habe ich für Windows gar nicht gefunden, geschweige denn kann man verlangen, dass es bei anderen Usern installiert ist).
Deine Sessions kannst Du Dir natuerlich auch ohne Modul verwalten.
Cronjobs möchte ich auch nicht gerade sehr gerne verwenden, da man ja auch nicht verlangen kann, dass jeder Cronjobs zur Verfügung hat, also wie kann man so ein Problem am besten angehen?
Diese benoetigst Du aber m.E..
Gruss,
Lude