Markus Trusk: Sessions beenden (Perl)

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.

  1. 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®

    --
    Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Development. Auch  für seriöse Agenturen.
    1. 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.

  2. 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

    --
    Ich bewundere wirklich den Sinn der Bienen für kollektive Verantwortung. Obwohl sich einzelne Bienen hin und wieder bekämpfen, herrscht zwischen Ihnen grundsätzlich ein starkes Gefühl für Eintracht und Zusammenarbeit. Wir Menschen gelten als sehr viel weiter entwickelt, doch mitunter rangieren wir sogar hinter kleinen Insekten.
    1. 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.

      1. 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

        --
        Q: God, root, what's the difference?
        A: God is merciful.
        1. 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.

          1. 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

            --
            <zentrum> wie war noch mal die option in make.conf fuer das benutzen von pipes um das compile zu beschluenigen?
            <CK1> CFLAGS="-pipe"
            <torsten> Oder man frage einen Gentooer seiner Wahl, wie man 2 km Compilerswitches fuer seine CPU hinbekommt ;)
            1. 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.

              1. 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

                --
                Zu wissen, was wir nicht wissen, ist die Quelle der Weisheit.
                1. 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:

                  retrieving data

                  my $f_name = $session->param('f_name');

                  or

                  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.

  3. 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