PHP Sessions
Sie befinden sich: Home > Php
> PHP
Sessions
In diesem Tutorial möchte ich Ihnen erklären, wie Sie Sessions in PHP benutzen können.
Die Sessions werden regelmäßig dazu verwendet, um einen Memberbereich
oder Administrationsbereich zu realisieren. Da nur der User einen Zugriff auf die Session
bekommt, dem die Session ID bekannt ist. Dadurch ist es möglich individuellen Inhalt für
einen User bereitzustellen oder diesen mit einem Passwortschutz zu versehen. In PHP wird
über den Befehl session_start() eine neue Session generiert.
Wird den Befehl session_start() die Session ID übergeben, greift der Server auf
die hinterlegte Datei zu. Wenn eine Session generiert wird, wird ein Text File unter dem
session.save_path generiert. Den Session Save_Path kann man mit dem Befehl session_save_path()
ändern. Dazu muss der Befehl vor session_start() ausgeführt werden.
Dieses Text File wird unter den Dateinamen Prefix „sess_“ und 32 zufällige
Zeichen gespeichert. Die 32 Zeichen ist die aktuelle Session ID, dadurch weiß der
Server, welche Datei genutzt werden soll. In diesem Text File werden alle Variablen
serialsiert gespeichert, die in der aktuellen Session generiert wurden.
Eine Session ist standardmäßig 180 Minuten aktiv, wenn bis dahin die Session nicht
wieder benutzt wurde, wird standardmäßig das Text File der Session gelöscht.
Dies ist abhängig von der Einstellung in der php.ini unter session.cache_expire.
Der Wert session.cache_expire definiert die Ablaufzeit der Session. Man kann auf
Wunsch mit new_cache_expire() diesen Wert ändern.
So nun ein Beispiel zum Starten einer Session:
<?php
session_start();
?>
Der Befehl session_start() sollte immer in der ersten Zeile eines PHP Scriptes
stehen. Der Befehl session_start() gibt true oder false zurück. Sollte die
Session nicht gestartet werden können, wird ein false zurückgegeben. Zusätzlich
muss der Befehl vor dem Senden des Http Header vom Dokument ausgeführt werden, da
ansonsten eine entsprechende Fehlermeldung kommt und nicht auf die Session zugegriffen
werden kann. Daher ist es empfehlenswert, mit dem Befehl headers_sent() zu prüfen,
ob der http Header bereits gesendet wurde.
Früher haben wir an dieser Stelle empfohlen, ein @-Zeichen vor session_start() zu
schreiben. Dies gilt aber, als eine unsaubere Lösung ohne den Fehler ordentlich zu
behandeln. Daher empfiehlt sich bei ein Entwicklungssystem kein @-Zeichen zu verwenden. Da
dies die Fehlerausgabe unterbindet.
Generell gilt die Regel bei Produktivsystemen, es dürfen keine Fehlermeldungen
ausgegeben werden. Die Fehlermeldung muss in den Logs geschrieben werden. Um zu prüfen,
ob bereits der Header gesendet wurde, empfehle ich eine try,
Catch Lösung.
Es empfiehlt sich generell zu prüfen, ob der Header gesendet wurde. Sollte dieser
bereits gesendet worden sein, kann man eine throw new Exception() werfen und später die
Fehlermeldung ausgeben ohne systemrelevante Informationen.
Beispiel zum Prüfen, ob bereits ein http Header gesendet wurde:
<?php
// prüfen ob der HTTP header bereits gesendet wurde
if (headers_sent() == false) {
// HTTP header wurde noch nicht gesendet
session_start();
}
?>
Nachdem wir nun die Session initialisiert haben, können wir damit beginnen, diese mit
Inhalt zu befüllen. Hierzu nutzen wir die Servervariable $_SESSION, in dieser
werden sogenannte Array Elemente abgelegt.
Wenn wir jetzt ein neuer Schlüssel mit einem Wert generieren möchten, müssen
wir folgendermaßen die Servervariable ansprechen.
<?php
if (headers_sent() == false) {
session_start();
/* Nun erstellen wir in der Session ein Schlüssel mit einen Wert */
$_SESSION['username'] = 'Nico Schubert';
}
?>
Wie oben in unserem Beispiel geschrieben, haben wir den Schlüssel „username“
mit dem Wert „Nico Schubert“ in unserer Session Array: $_SESSION gespeichert.
Wenn der Browser Cookies zulässt, wird jetzt ein Cookie mit der Session ID gespeichert.
Jedoch könnten wir in einer weiteren Seite mit diesem Schlüssel den Inhalt der
Session ausgeben. Da nicht immer sichergestellt werden kann, dass die Session ID per Cookie
gespeichert wird. Sollte man die Session ID über die Konstante SID oder session_id()
per
GET
oder
POST
übergeben?
Hier das Beispiel für die Ausgabe: (Anm.: Bitte speichern Sie die Datei
mit dem Dateinamen: seite2.php)
<?php
if (headers_sent() == false) {
if (!isset($_GET['PHPSESSID'])) $_GET['PHPSESSID'] = '';
if ($_GET['PHPSESSID'] != '') {
session_start($_GET['PHPSESSID']);
} else {
session_start();
}
if (!isset($_SESSION['username'])) $_SESSION['username']
= '';
if ($_SESSION['username'] != '') {
echo 'Ihr Benutzername ist: '.$_SESSION['username'];
} else {
echo 'Es konnte kein Benutzernamer ermittelt werden.';
}
}
?>
Erklärung: In der ersten Zeile prüfen wir, ob bereits der HTTP
Header gesendet wurde. Wenn dieser noch nicht gesendet wurde, prüfen wir mit isset(), ob die
GET Variable: $_GET['PHPSESSID'] gesetzt wurde, ansonsten machen wir diese Variable
dem PHP Script bekannt. In der nächsten Zeile prüfen wir, ob die Variable: $_GET['PHPSESSID']
einen Wert enthält. Wenn die Variable einen Wert enthält, starten wir in der nächsten
Zeile mit diesem Wert unserer Session.
Sollte kein Wert in $_GET['PHPSESSID'] enthalten sein, starten wir normal ohne
Übergabe der Session ID, die Session. Im nächsten Abschnitt prüfen wir, ob
die Variable: $_SESSION['username'] bereits einen Wert enthält, ansonsten
machen mir diese Variable den PHP Script bekannt. Nun prüfen wir, ob die Variable: $_SESSION['username']
einen Wert enthält und geben diesen Wert aus.
Hinweis: Man sollte bei diesem Beispiel eine IP Überprüfung
einbauen, da ansonsten jeder auf die Session zugreifen kann. Empfehlenswert wäre, die
IP-Adresse in der Session zu speichern und dann wieder zu prüfen, ob diese existiert.
Es wird hier erklärt, wie man in PHP
eine IP-Adresse ermittelt. Anschließend prüft man mit einer sogenannten
IF-Anweisung, ob die IP-Adresse in der
Session enthalten ist. Zusätzlich kann man mit session_regenerate_id() auch
vereinzelt im Scriptlauf die Session ID mal ändern, dies erhöht die Sicherheit.
Wenn Sie die Sessionvariable wieder löschen möchten, können Sie hierzu unset()
oder session_destroy() verwenden. Sie können das gesamte Transport Script hier
herunterladen.
Soweit alles klar? Wenn ja, so können Sie hier das
nächste Thema anfangen. Dabei geht es darum, einen
lokalen Entwicklungsserver einrichten. |