Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Geleitwort
Vorwort
1 PEAR – Einführung
2 Authentication
3 Caching
4 Date and Time
5 File Formats
6 HTTP
7 Internationalization
8 Mail
9 Networking
10 PHP
11 Text
12 Web Services
13 Benchmarking
14 Configuration
15 Database
16 File System
17 HTML
18 Images
19 Logging
20 Math
21 Numbers
22 Tools and Utilities
23 XML
24 Selbst Pakete erstellen
25 PECL
Index
Ihre Meinung?

Spacer
 <<   zurück
PHP PEAR von Carsten Möhrke
Anwendung und Entwicklung – Erweiterungen für PHP schreiben
Buch: PHP PEAR

PHP PEAR
798 S., 39,90 Euro
Rheinwerk Computing
ISBN 3-89842-580-0
gp 6 HTTP
  gp 6.1 HTTP
  gp 6.2 HTTP_Header
    gp 6.2.1 Cache-Steuerung
  gp 6.3 HTTP_Request
  gp 6.4 HTTP_Download
  gp 6.5 HTTP_Upload
  gp 6.6 HTTP_Session


Rheinwerk Computing

6.6 HTTP_Session  toptop


Besprochene Version: 0.4 Lizenz: BSD
Klassendatei(en): HTTP/Session.php; HTTP/Session/Container/DB.php

Ein Großteil der heutzutage vorhandenen Webseiten basiert auf Sessions. Das hat vielerlei unterschiedliche Gründe. Teilweise soll einfach nur das Nutzerverhalten erfasst werden, und in anderen Fällen ist eine Session Teil eines Authentifizierungssystems.

Das Management von Sessions mithilfe von PHP stellt zwar kein großes Problem dar, aber viele Funktionalitäten, die für die tägliche Arbeit hilfreich sind, müssen oft von Hand implementiert werden, um eine sinnvolle Session-Verwaltung zu ermöglichen. Dieser Problematik nimmt sich HTTP_Session an. Das Paket stellt Ihnen zum einen Funktionen zur Arbeit mit Sessions zur Verfügung, und zum anderen gibt es Ihnen die Möglichkeit, Sessions auch in einer Datenbank abzulegen, was sehr hilfreich sein kann.

Um eine neue Session zu starten, ist die Methode start() implementiert, die, wie die anderen Methoden auch, statisch aufgerufen werden kann. Um zu steuern, wie lange eine Session gültig sein soll, stehen die Methoden setExpire() und setIdle() [Idle bedeutet so viel wie Leerlauf. ] zur Verfügung. In beiden Fällen wird die gewünschte Zeit in Sekunden übergeben. setExpire() legt hierbei fest, wie lange die Session maximal gültig sein soll. setIdle() legt im Gegensatz dazu fest, wie lange der Client inaktiv sein darf, bevor die Session verfällt. Somit könnten Sie für die Session beispielsweise definieren, dass sie maximal einen Tag gültig sein soll, so dass ein eingeloggter User in seiner Arbeit nicht durch ein automatisches Logout behindert wird. Aus Sicherheitsgründen könnte die Idle-Zeit aber auf 10 Minuten festgesetzt werden, so dass die Session automatisch ungültig wird, wenn ein User 10 Minuten keine Aktivität zeigt oder vergisst, sich auszuloggen.

Ein einfaches Login auf Basis dieser Session-Funktionen könnte so aussehen wie in Listing 6.6.

require_once('HTTP/Session.php'); 
 
// Funktion, um ein Login-Formular auszugeben 
function login_form($msg) 
{ 
   echo $msg; 
?> 
   <form method="post"> 
      Login <input type="text" name="login" /><br /> 
      Passwort <input type="password" name="password" /><br /> 
      <input type="submit" value="Login" /> 
   </form> 
<?php 
} 
 
//Session starten 
HTTP_Session::start(); 
 
// Expire-Zeit auf Uhrzeit +24 Stunden setzen 
HTTP_Session::setExpire(60*60*24); 
 
// Idle-Zeit auf Uhrzeit + 10 Minuten 
HTTP_Session::setIdle(10*60); 
 
// Handelt es sich um eine neue Session? 
if ( true === HTTP_Session::isNew() ) 
{ 
   // Login-Formular ausgeben 
   login_form('Bitte loggen Sie sich ein'); 
   HTTP_Session::set('logged_in',false); 
} 
else 
{ 
   // Wurden Daten aus einem Formular uebergeben? 
   if ( true === isset($_POST['login'])) 
   { 
      // Daten korrekt eingegeben? 
      if ('admin' === $_POST['login'] && 
          'geheim' === $_POST['password']) 
      { 
         //Session-Variable setzen und Idle-Zeit aktualisieren 
         HTTP_Session::set('logged_in',true); 
         HTTP_Session::updateIdle(); 
      } 
      else 
      {_$ret_         //Login-Formular neu ausgeben 
         login_form('Username oder Passwort nicht korrekt'); 
      } 
   } 
   // Sind wir eingeloggt? 
   if (true===HTTP_Session::get('logged_in')) 
   { 
      // Session abgelaufen ? 
      if (true === HTTP_Session::isExpired()) 
      { 
         echo'Die Sitzung wird automatisch nach 24 Stunden 
              beendet<br />'; 
         echo "<a href='$_SERVER[PHP_SELF]'>neu einlogen</a>"; 
         HTTP_Session::destroy(); 
      } 
      // Zu lange nichts gemacht? 
      elseif (true === HTTP_Session::isIdle()) 
      { 
         echo 'Sie waren zu lange inaktiv<br />'; 
         echo "<a href='$_SERVER[PHP_SELF]'>neu einloggen</a>"; 
         HTTP_Session::destroy(); 
      } 
      else 
      { 
         // OK, wir sind drin, und alles ist gut 
         HTTP_Session::updateIdle(); 
         echo 'Sie sind eingeloggt'; 
      } 
   } 
}

Listing 6.6 Login auf Basis von PEAR::HTTP_Session

Nach dem HTTP_Session::start() werden bei jedem Aufruf der Seite setExpire() und setIdle() aufgerufen. Da die beiden Methoden bei ihrem ersten Aufruf die aktuelle Uhrzeit speichern, stellt es kein Problem dar, sie jedes Mal aufzurufen. Die gewünschte Dauer wird jeweils in Sekunden übergeben. Möchten Sie eine bereits enthaltene Zeitangabe verändern, ist das keine Schwierigkeit. In dem Fall müssten Sie als zweiten Wert true übergeben, was dazu führt, dass die übergebene Zeit zu der bereits vorhandenen addiert wird. Natürlich können Sie auch einen negativen Wert übergeben, um die Zeitspanne zu kürzen. Bei einem Login stellt sich immer die Frage, ob das Login-Formular ausgegeben werden soll oder ob überprüft werden muss, ob die eingegebenen Werte korrekt sind. Um den ersten Aufruf der Seite eindeutig identifizieren zu können, habe ich hier auf isNew() zurückgegriffen. Diese Methode bestätigt mit einem true, dass eine Session neu erstellt wurde. Wurde eine existente Session wieder aufgegriffen, gibt die Methode false zurück. Um zu erkennen, ob der Benutzer eingeloggt ist, wird die Variable logged_in in der Session abgelegt. Zwar können Sie auch direkt auf das superglobale Array $_SESSION zugreifen, aber die Nutzung der Methode set() ist an dieser Stelle sicher konsequenter. Sie bekommt den Namen der Variable und den gewünschten Wert als Parameter übergeben. Zum Auslesen ist get() vorgesehen. Sie liefert den Wert der Variable zurück, deren Namen Sie als Parameter übergeben haben. Sollte eine Variable nicht definiert sein, ist der Rückgabewert standardmäßig NULL. Sie können allerdings auch einen zweiten Parameter übergeben, der dann als Rückgabewert genutzt wird, wenn die Variable nicht existieren sollte.

Die Methoden isExpired() und isIdle() überprüfen, ob eine der beiden Zeitgrenzen überschritten wurde. Um sicherzustellen, dass die Leerlaufzeit korrekt gemessen werden kann, muss bei jedem Aufruf der Seite die Methode updateIdle() aufgerufen werden. Sie aktualisiert bei jedem Aufruf die Uhrzeit der letzten Aktivität.

Um eine Session zu beenden, reicht es, wenn Sie einmal die Member-Funktion destroy() aufrufen.

Interessant an diesem Paket ist, dass Sie die Session-Daten auch in einer Datenbank ablegen können. Üblicherweise werden diese im temporären Verzeichnis auf der Festplatte des Servers abgelegt. Das kann allerdings deutliche Nachteile mit sich bringen. Zum einen kann das Verzeichnis voll sein, und zum anderen besteht auch die Gefahr, dass dort enthaltene Daten ausgespäht werden könnten. Auch wenn eine Session über mehrere Server hinweg genutzt werden soll, wird es problematisch.

Zu diesem Zweck sieht PHP die Möglichkeit vor, dass die Session-Daten auch an anderen Orten gespeichert werden können. In HTTP_Session ist diese Möglichkeit aufgegriffen worden, so dass Sie die Daten auch in einer Datenbank speichern können. Hierzu wird im Hintergrund das Paket PEAR::DB genutzt, so dass Sie auf alle Server-Typen zugreifen können, die von diesem Paket unterstützt werden.

Zum Erstellen der benötigten Tabelle wird in der Dokumentation des Pakets folgender SQL-Befehl vorgeschlagen:

CREATE TABLE `sessiondata` ( 
         `id` CHAR(32) NOT NULL, 
         `expiry` INT UNSIGNED NOT NULL DEFAULT 0, 
         `data` TEXT NOT NULL, 
         PRIMARY KEY (`id`) 
      );

Listing 6.7 SQL-Befehl zum Anlegen der Tabelle

Die Namen der Felder sowie die Größe und der Datentyp müssen entsprechend erhalten bleiben, wohingegen der Name der Tabelle sich ändern darf.

Um dem Paket mitzuteilen, dass die Session-Daten in einer Datenbank abgelegt werden sollen, nutzen Sie den Befehl setContainer(). Dieser bekommt als ersten Parameter den String 'DB' übergeben. Vielleicht wundern Sie sich jetzt, dass der Name des Containers explizit übergeben werden muss. Das liegt daran, dass die Architektur des Pakets vorsieht, dass auch andere Container zur Datenablage genutzt werden können. Allerdings sind noch keine weiteren Container implementiert.

Der zweite Parameter, den die Methode benötigt, spezifiziert die Optionen, die der Speichercontainer benötigt, um seinen Dienst versehen zu können. In diesem Fall handelt es sich um ein Array, das mindestens den Schlüssel 'dsn' enthalten muss. Dieser muss auf einen gültigen Datenbank-DSN verweisen, wie er in Abschnitt 15.1 (PEAR::DB) erläutert wird. Die beiden weiteren, optionalen Schlüssel, die akzeptiert werden, sind 'table' und 'autooptimize'. Mit 'table' können Sie einen anderen Tabellennamen definieren, wenn die Tabelle in Ihrem Fall nicht sessiondata heißen sollte. Der dritte Schlüssel kann einen booleschen Wert enthalten, auf den ich später noch eingehen werde.

Möchten Sie mit einem Container arbeiten, müssen Sie setContainer() vor dem Start der Session aufrufen.

// MySQL-Datenbank, User netviser, Passwort geheim 
// Server laeuft auf localhost, Datenbank ist netviser 
$dsn='mysql://netviser:geheim@localhost/netviser'; 
 
$options=array ('dsn'          => $dsn, 
                'table'        => 'sessiondata', 
                'autooptimize' => true 
         ); 
HTTP_Session::setContainer('DB',$options); 
HTTP_Session::start();

Session-Daten, die auf der Festplatte des Servers landen, werden automatisch gelöscht. Die veralteten Einträge in der Datenbank entfernt das Paket auch automatisch, wozu die Methode namens gc() (Garbage Collection) vorgesehen ist. Sie wird automatisch aufgerufen und wertet das oben erwähnte Array-Element 'autooptimize' aus. Ist dort ein true enthalten, wird die Tabelle automatisch optimiert. Dadurch dauert die »Müllabfuhr« zwar ein wenig länger, aber folgende Datenbankzugriffe sind dafür wieder schneller. Eine Optimierung ist zurzeit nur für MySQL und PostgreSQL implementiert.

 <<   zurück
     
  Zum Katalog
Zum Katalog: PHP PEAR
PHP PEAR
Jetzt bestellen!
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: PHP 5.6 und MySQL 5.7






 PHP 5.6 und
 MySQL 5.7


Zum Katalog: Einstieg in PHP 5.6 und MySQL 5.6






 Einstieg in PHP 5.6
 und MySQL 5.6


Zum Katalog: Responsive Webdesign






 Responsive Webdesign


Zum Katalog: Moderne Websites entwickeln






 Moderne Websites
 entwickeln


Zum Katalog: MySQL 5.6






 MySQL 5.6


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo








Copyright © Rheinwerk Verlag GmbH 2007
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Rheinwerk Computing]

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de