Grundlegende Anwendung

Sessions bieten eine einfache Möglichkeit, Daten für individuelle Benutzer unter einer eindeutigen Session-ID zu speichern. Sie können verwendet werden, damit Daten zwischen Seitenanforderungen bestehen bleiben. Session-IDs werden in der Regel über Session-Cookies an den Browser gesendet und die ID wird verwendet, um vorhandene Sessiondaten abzurufen. Das Fehlen einer ID oder eines Session-Cookies veranlasst PHP, eine neue Session zu erstellen und eine neue Session-ID zu erzeugen.

Sessions folgen einem einfachen Ablauf. Wenn eine Session gestartet wird, ruft PHP entweder eine vorhandene Session unter Verwendung einer (normalerweise von einem Session-Cookie) übergebenen ID ab oder erzeugt eine neue Session, falls keine keine Session-ID übergeben wurde. Nachdem die Session gestartet wurde, füllt PHP die $_SESSION-Superglobale mit allen Sessiondaten. Am Ende des Skripts nimmt PHP automatisch den Inhalt der $_SESSION-Superglobalen, serialisiert ihn und verwendet Session-Speicherfunktion um ihn zu speichern.

Standardmäßig verwendet PHP die interne files-Speicherroutine, die mittels session.save_handler festgelegt ist. Diese speichert die Sessiondaten auf dem Server an der mit der Konfigurationsanweisung session.save_path angegebenen Stelle.

Sessions können über die Funktion session_start() gestartet werden. Falls die Konfigurationsanweisung session.auto_start auf 1 gesetzt ist, wird eine Session automatisch zu Beginn einer Anfrage gestartet.

Sessions werden normalerweise automatisch geschlossen, wenn PHP am Ende eines Skripts ist, können aber über session_write_close() auch manuell geschlossen werden.

Beispiel #1 Registrierung einer Variablen mit $_SESSION.

<?php
session_start
();
if (!isset(
$_SESSION['zaehler'])) {
  
$_SESSION['zaehler'] = 0;
} else {
  
$_SESSION['zaehler']++;
}
?>

Beispiel #2 Aufheben der Registrierung einer Variablen mit $_SESSION.

<?php
session_start
();
unset(
$_SESSION['zaehler']);
?>

Achtung

Heben Sie NICHT die Registrierung der gesamten $_SESSION mit unset($_SESSION) auf, weil dies die Registrierung von Variablen durch die Superglobale $_SESSION deaktivieren würde.

Warnung

Sie können in Session-Variablen keine Referenzen verwenden, weil es keine praktikable Möglichkeit gibt, eine Referenz in eine andere Variable zurückzuführen.

Warnung

register_globals überschreibt im globalen Namensraum Variablen, deren Namen mit denen von Sessionvariablen übereinstimmen. Für Details siehe Verwendung von Register Globals.

Hinweis:

Bei dateibasierten Sessions (der Standard in PHP) wird die Sessiondatei gesperrt, wenn eine Session über session_start() oder implizit über session.auto_start geöffnet wurde. Einmal gesperrt, kann solange kein anderes Skript auf die selbe Sessiondatei zugreifen, bis die Session durch Beenden des ersten Skripts oder durch den Aufruf von session_write_close() geschlossen wurde.

Dies ist wahrscheinlich ein Problem auf Websites, die verstärkt AJAX verwenden und mehrere gleichzeitige Zugriffe haben. Der einfachste Weg, damit umzugehen ist, session_write_close() möglichst früh im Skript aufzurufen, sobald alle nötigen Änderungen an der Session vorgenommen wurden. Alternativ könnte ein Session-Backend verwendet werden, das gleichzeitige Zugriffe unterstützt.

add a note add a note

User Contributed Notes 4 notes

up
14
AlexFBP
2 years ago
Regardless, if you need to set the header 'Location:' before closing the session; explicitly close the php script with "exit()" or "die()" functions. Remember that when a php script ends, the session automatically are going to be closed.
up
-4
jpleveille at webgraphe dot com
2 years ago
As mentioned in the documentation, using session_write_close() shuts down the session. It is particularly useful if you want to use header('Location: SOMEURL'); to a URL within the same scope of the current script, that will load the session. Why?

When you use this header directive, the browser is requested to redirect the user to the given URL. If that URL is in the scope of the script where header() is called (let's say, same URL), the requested URL "COULD" load the session BEFORE it has actually been shut down in the previous script, and you might end up with the session from the previous request, reverting all modifications to session in the the last script.

<?php
session_start
();

if (!isset(
$_SESSION['hello']))
{
 
$_SESSION['hello'] = 'world';

 
session_write_close();
 
// session is now closed, it's safe to redirect
  // if not closed, $_SESSION['hello'] may not be set properly
  // when loading the page again
  // (in this very case, calls to this script could loop for a while)
 
header('Location: ' . $_SERVER['PHP_SELF']);
}
?>
up
-8
guy at syntheticwebapps dot com
1 year ago
Despite the warning about not being able to use references inside the session space, I've done it in the past and apparently completely successfully. That is, I can do something like this:

<?php
session_start
();
if (!
$_SESSION['favorite']) {
   
$_SESSION['cow'] = "Elsie";
   
$_SESSION['favorite'] =& $_SESSION['cow'];
    echo
"We set cow = '$_SESSION[cow]' and favorite =& cow ($_SESSION[favorite]).<br/>Reload the page to see if both change when one changes later.<br/>";
} else {
    echo
"Having re-entered the session after initial settings were made: cow = $_SESSION[cow] and favorite = $_SESSION[favorite].<br/>";
   
$_SESSION['cow'] = "Bessie";
    echo
"We reassigned cow = $_SESSION[cow] and our restored reference variable favorite = $_SESSION[favorite]<br/>Note the presence of the &s in the var_dump below.<pre>";
   
var_dump($_SESSION);
    echo
"</pre><br/>If you reload, the test will begin again.";
    unset(
$_SESSION['cow'], $_SESSION['favorite']);
   
session_destroy();
}
?>
yields the following after the second request:

Having re-entered the session after initial settings were made: cow = Elsie and favorite = Elsie.
We reassigned cow = Bessie and our restored reference variable favorite = Bessie
Note the presence of the &s in the var_dump below.
array(2) {
  ["cow"]=>
  &string(6) "Bessie"
  ["favorite"]=>
  &string(6) "Bessie"
}
If you reload, the test will begin again.

I've found this ability very useful and storage efficient in the session data.
up
-21
eddie at onefoldmedia dot com
1 year ago
If a session is not saving and you have verified that session_start() is being called, then double check capitalization. $_session can store variables but will not be treated like a session or cause an error.
To Top