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 sehr häufig dazu verwendet,
um einen Memberbereich
beziehungsweise Administrationsbereich
zu realisieren. Da nur der User einen Zugriff auf
die Session bekommt, den die Session ID bekannt ist.
Dadurch ist es möglich individuellen Inhalt für einen
User bereit zu stellen oder diesen mit ein 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 den session.save_path generiert.
Den Session Save_Path kann man mit den 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 nunr 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 den 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 müssen in den Log 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 so genannte Array Elemente
abgelegt. Wenn wir nun ein neuen 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
nun ein Cookie mit der Session ID gespeichert. Nun
könnten wir in einer weiteren Seite mit diesen
Schlüssel den Inhalt der Session ausgeben. Da
nicht immer sichergestellt werden kann, das die Session
ID per Cookie gespeichert wird. Sollte man die Session
ID über die Konstante SID oder session_id() per GET
oder POST
übergeben.
Nachfolgend ein Beispiel für die Übergabe:
<?php
if (headers_sent() == false) {
session_start();
// Nun erstellen wir in der Session ein Schlüssel mit einen
Wert
$_SESSION['username'] = 'Nico Schubert';
}
?>
Hier das Beispiel für die Ausgabe. Bitte Speichern
Sie die Datei mit den Dateiname: 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 den 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 diesen
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 so genannten IF-Anweisung ob
die IP Adresse in der Session enthalten ist. Zusätzlich
kann man mit session_regenerate_id() auch
ab und zu im Scriptlauf die Session ID mal ändern,
dies erhöht die Sicherheit.
Wenn Sie die Session Variable 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. |