Melvin Cowznofski: Sessions endgültig löschen

Hallo,

im PHP Manual wird im Kapitel session_destroy() beim ersten Beispiel aufgezeigt, wie man eine Session endgültig löscht:

<?php
// Initialisierung der Session.
// Wenn Sie session_name("irgendwas") verwenden, vergessen Sie es
// jetzt nicht!
session_start();

// Löschen aller Session-Variablen.
$_SESSION = array();

// Falls die Session gelöscht werden soll, löschen Sie auch das
// Session-Cookie.
// Achtung: Damit wird die Session gelöscht, nicht nur die Session-Daten!
if (ini_get("session.use_cookies")) {
    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000, $params["path"],
        $params["domain"], $params["secure"], $params["httponly"]
    );
}

// Zum Schluß, löschen der Session.
session_destroy();
?>

Wenn ich das 1:1 übertrage und eine mögliche Session danach mit var_dump($_SESSION); überprüfe, bekomme ich noch immer ein leeres Arry zurück. Die Session existiert also noch:

array(0) { } zurück.

Erst, wenn ich zusätzlich noch ein unset($_SESSION); hinzufüge, wird mir bei einer Überprüfung mit var_dump($_SESSION); mitgeteilt, dass es keine Globale Sessionvariable gibt:

Notice: Undefined variable: _SESSION in ... on line ... NULL

Diese Meldung würde ich eigentlich schon erwarten, ohne dass ich noch das unset($_SESSION); hinzufügen muss. Im Beispielcode steht als Kommentar explizit: "Achtung: Damit wird die Session gelöscht, nicht nur die Session-Daten!"

Auch die Aussage "Um wieder Session-Variablen verwenden zu können, muss session_start() aufgerufen werden." in der Beschreibung der Funktion kann ich so nicht nachvollziehen. Wenn ich an den Code des Beispiels statt dem unset($_SESSION); ein $_SESSION['bar'] = 'foo'; anhänge (ohne einem session_start(); !!!), dann funktioniert das wunderbar und kann anschließend mit var_dump($_SESSION); auch ausgegeben werden.

Kann mir bitte wer sagen, wieso das so ist und wo da mein Verständnisproblem liegt? Und vorallem: Da kann ich mir den ganzen Hokuspokus des Beispielcodes ja gleich sparen und mit unset($_SESSION); eine komplette Session kurz und knapp eliminieren? Oder nicht?

Mit lieben Grüßen

Melvin Cowznofski

--
What – me worry?
  1. Hi,

    vergleiche die Session-Tokens.

    Nur wenn sie gleich sind, handelt es sich (wahrscheinlich mit 99,999%) um dieselbe Session. Das bedeutet aber nicht, dass bei unterschiedlichen Session-Tokens kein Tracling stattfinden kann.

    LG Ein Poster

  2. Hallo Melvin,

    die Session ist mehr als das $_SESSION Array. Genau genommen ist $_SESSION lediglich die Arbeitsspeicherkopie auf die eigentliche Session.

    Eine Session besteht zunächst aus einer Session-ID, die beim ersten session_start generiert wird. Diese ID kann in einem Cookie gespeichert oder in der URL verschlüsselt werden. Basierend auf dieser ID wird ein Speicherbereich angelegt, in dem die Sessiondaten abgelegt werden. Außerdem führt PHP noch einige interne Session-Daten.

    session_destroy löscht den Hintergrundspeicher und die internen Session-Daten, wenn ich das richtig verstanden habe. Das $_SESSION Array wird nicht gelöscht, und wenn Du einen Session-Cookie nutzt, auch dieser nicht. Den Cookie musst Du selbst löschen, $_SESSION ist egal. Normalerweise wirst Du ja nach einem session_destroy nicht mehr viel zu tun haben; das ist eigentlich eine der letzten Amtshandlungen nach einem Logout des Users.

    Um abzufragen, ob gerade eine Session offen ist, verwende die session_status Funktion.

    Rolf

    --
    sumpsi - posui - obstruxi
    1. Hi,

      Eine Session besteht zunächst aus einer Session-ID, die beim ersten session_start generiert wird. Diese ID kann in einem Cookie gespeichert oder in der URL verschlüsselt werden. Basierend auf dieser ID wird ein Speicherbereich angelegt, in dem die Sessiondaten abgelegt werden. Außerdem führt PHP noch einige interne Session-Daten.

      Könntest Du die "internen Sessiondaten von PHP" bitte genauer beschreiben?

      LG
      Mitleser

      1. Hallo mitleser,

        ich fühle mich getrollt.

        Also: RTFM

        Rolf

        --
        sumpsi - posui - obstruxi
        1. Hi,

          Hallo mitleser,

          ich fühle mich getrollt.

          Wieso?

          Also: RTFM

          Ich kann da nirgends "internd Sessiondaten von PHP" finden.

          Fakt ist:

          • Es gibt ein Session-Token $token = session_id()
          • Es gibt eine Sessiondatei im session.save_path unter dem Namen "sess_" . $token

          Ich habe nun gefragt, was es sonst noch gibt.
          Was habe ich übersehen?

          LG
          Mitleser

          1. Hallo mitleser,

            Wieso getrollt? Weil die Anfrage so abstrakt war, dass man darüber einen Roman schreiben könnte. Bzw. man erstmal ein paar Stunden recherchieren müsste, um sie gründlich zu beantworten.

            Aber was ich meinte, ist: der Sessionhandler, die Kontrolldaten für den Garbage Collector, und ich habe auch gelesen, dass PHP dafür sorgt, dass nicht zwei Requests die gleiche Session öffnen und sich damit gegenseitig überschreiben. Bei file storage kann ich mir noch vorstellen, wie das funktioniert, bei einem custom storage nicht - es sei denn, PHP hat einen Locking-Mechanismus, der unabhängig vom Sessionspeicher arbeitet. Spätestens bei einem Servercluster wird das aber durchaus komplex und das PHP Handbuch verrät kein Sterbenswörtchen über die Anforderungen, die zu erfüllen sind.

            URL rewriting für transparente SIDs in der URL braucht sicher auch Daten (wenn man es denn nutzt - Session Cookies sind der empfohlene Weg)

            Hinzu kommt die Erkennung einer nicht initialisierten Session, was vom Handbuch nur als Überschrift genannt wird und irgendwie über das SessionUpdateTimestampHandlerInterface funktionieren soll.

            Die Millionen anderen session.-Optionen der php.ini brauchen vermutlich auch noch irgend einen Support.

            Also - eine gute Antwort braucht Recherche, die teils auch noch über's Handbuch hinausgeht, und ich war mir sicher, dass Du das gewusst hast als Du gefragt hast. Das hier war nur ein Anriss einer guten Antwort.

            Rolf

            --
            sumpsi - posui - obstruxi
            1. Hi,

              das sind alles Einstellungen und keine Daten, die den Benutzer individuell betreffen. Die Einstellungen werden typisch nicht gelöscht, wenn die Session zerstört wird.

              Also - eine gute Antwort braucht Recherche, die teils auch noch über's Handbuch hinausgeht, und ich war mir sicher, dass Du das gewusst hast als Du gefragt hast. Das hier war nur ein Anriss einer guten Antwort.

              Das war aber nicht die Frage des OP.

              Dass Handbuchstudium und Diskussion darüber nicht dümmer machen, stand nicht in Frage.

              LG
              Mitleser

              1. Hallo Mitleser,

                die Frage war, wie man eine Session löscht und wo Verständnisprobleme vorliegen.

                Teil meiner Antwort war, dass $_SESSION nicht die eigentliche Session ist, sondern dass PHP jede Menge andere Daten als Teil der Session hält.

                Der Sessionhandler - beispielsweise - ist keine Einstellung, sondern eine Einstellung sorgt dafür, dass ein bestimmter Sessionhandler geladen (oder aktiviert) wird. Eine Aktion von session_destroy ist es, den Sessionhandler zu beenden und seine internen Steuerdaten zu löschen.

                Ich habe deine Nachfrage jetzt beantwortet und du weißt, wie ich sie gemeint habe. Eine in die Tiefe gehende Diskussion über PHP Sessions geht über den Rahmen des Threads hinaus, und auch über den Rahmen meiner PHP Detailkenntnisse. Meinetwegen kannst Du nun jedes einzelne Wort von mir auf die Goldwaage legen, und Dich darüber aufregen, wieso ich mit meinem Halbwissen überhaupt Antworten schreibe. Womit wir dann wieder bei meiner Eingangsaussage wären: Ich fühle mich getrollt.

                Rolf

                --
                sumpsi - posui - obstruxi
                1. Hallo Rolf,

                  auf jeden Fall danke für die Beantwortung meiner Frage!

                  Mit lieben Grüßen

                  Melvin Cowznofski

                  --
                  What – me worry?