| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- EN-Revision: 21819 -->
- <!-- Reviewed: no -->
- <sect1 id="learning.multiuser.sessions">
- <title>User Session im Zend Framework managen</title>
- <sect2 id="learning.multiuser.sessions.intro">
- <title>Einführung in Sessions</title>
- <para>
- Der Erfolg des Webs ist tief verwurzelt im Protokoll welches das Web antreibt: HTTP.
- HTTP über TCP ist von seiner Natur her Statuslos, was bedeutet dass auch das Web selbst
- Statuslos ist. Wärend dieser Aspekt einer der dominierenden Faktoren dafür ist warum das
- Web ein so populäres Medium geworden ist, verursacht es auch einige interessante
- Probleme für Entwickler welche das Web als Anwendungsplattform verwenden wollen.
- </para>
- <para>
- Das Akt der Interaktion mit einer Web Anwendung wird typischerweise definiert von der
- Summe aller Anfragen die an den Web Server gesendet werden. Da es viele Konsumenten
- gibt die simultan bedient werden, muss die Anwendung auswählen welche Anfragen zu
- welchem Benutzer gehören. Diese Anfragen sind typischerweise als "session" bekannt.
- </para>
- <para>
- In <acronym>PHP</acronym> wurde das Session Problem durch die Session Erweiterung gelöst
- welche eine Form der Statusverfolgung, typische Cookies und eine Form des lokalen
- Speichers verwendet der über die Superglobale $_SESSION bekanntgemacht wird. Im Zend
- Framework fügt die Komponente Zend_Session zusätzliche Vorteile zu
- <acronym>PHP</acronym>'s Session Erweiterung hinzu, welche es einfacher machen diese zu
- verwenden und auf objekt-orientierten Anwendungen beruht.
- </para>
- </sect2>
- <sect2 id="learning.multiuser.sessions.basic-usage">
- <title>Grundsätzliche Verwendung von Zend_Session</title>
- <para>
- Die Komponente Zend_Session ist sowohl ein Session Manager als auch eine
- <acronym>API</acronym> für das Speichern von Daten im Session Objekt für eine
- Langzeit-Verfügbarkeit. Die <acronym>API</acronym> von Zend_Session ist für das Managen
- der Optionen und des Verhaltens einer Session, wie Optionen, Starten und Stoppen einer
- Session, und Zend_Session_Namespace ist das aktuelle Objekt welches zum Speichern der
- Daten verwendet wird.
- </para>
- <para>
- Wärend es generell eine gute Praxis ist eine Session im Bootstrap Prozess zu starten,
- ist dies generell nicht notwendig da alle Sessions bei der ersten Erstellung eines
- Zend_Session_Namespace Objekts automatisch gestartet werden.
- </para>
- <para>
- Zend_Application ist in der Lage Zend_Session als Teil des Zend_Application_Resource
- Systems zu konfigurieren. Um das zu verwenden, nehmen wir an dass das Projekt
- Zend_Application für das Bootstrappen verwendet. Man würde den folgenden Code in der
- Datei application.ini hinzufügen:
- </para>
- <programlisting language="php"><![CDATA[
- resources.session.save_path = APPLICATION_PATH "/../data/session"
- resources.session.use_only_cookies = true
- resources.session.remember_me_seconds = 864000
- ]]></programlisting>
- <para>
- Wie man sieht sind die übergebenen Optionen die gleichen Optionen welche man in der
- ext/session Erweiterung von <acronym>PHP</acronym> erwarten würde zu finden. Diese
- Optionen stellen den Pfad zu den Session Dateien ein in dem Daten des Projekts
- gespeichert werden. Da Ini Dateien zusätzlich Konstanten verwenden können, wird das
- obige die Konstante APPLICATION_PATH verwenden und relativ auf das Verzeichnis der
- Sessiondaten zeigen.
- </para>
- <para>
- Die meisten Zend Framework Komponenten welche Sessions verwenden benötigen nichts
- zusätzliches um Zend_Session zu verwenden. An diesem Punkt verwendet man entweder eine
- Komponente welche Zend_Session verwendet, oder startet das Speichern eigener Daten in
- einer Session mit Zend_Session_Namespace.
- </para>
- <para>
- Zend_Session_Namespace ist eine einfache Klasse welche auf Daten über eine einfach zu
- verwendende <acronym>API</acronym> in der von Zend_Session gemanagten superglobalen
- $_SESSION verweist. Der Grund warum es Zend_Session_Namespace genannt wird ist, das es
- die Daten in $_SESSION effektiv namespaced, und es so mehreren Komponenten und Objekten
- erlaubt Daten sicher zu speichern und zu empfangen. Im folgenden Code sehen wir wie ein
- einfacher hochzählender Counter für Sessions erstellt werden kann der bei 1000 anfängt
- und sich selbst nach 1999 zurücksetzt.
- </para>
- <programlisting language="php"><![CDATA[
- $mysession = new Zend_Session_Namespace('mysession');
- if (!isset($mysession->counter)) {
- $mysession->counter = 1000;
- } else {
- $mysession->counter++;
- }
- if ($mysession->counter > 1999) {
- unset($mysession->counter);
- }
- ]]></programlisting>
- <para>
- Wie man oben sieht verwendet das Session Namespace Objekt die magischen __get, __set,
- __isset, und __unset um die einfache und flüssige Interaktion mit der Session er
- erlauben. Die Information welche im obigen Beispiel gespeichert wird, wird unter
- $_SESSION['mysession']['counter'] gespeichert.
- </para>
- </sect2>
- <sect2 id="learning.multiuser.sessions.advanced-usage">
- <title>Gehobenere Verwendung von Zend_Session</title>
- <para>
- Wenn man zusätzlich den DbTable Speicher Handler für Zend_Session verwenden will, dann
- kann man den folgenden Code in der application.ini hinzufügen:
- </para>
- <programlisting language="php"><![CDATA[
- resources.session.saveHandler.class = "Zend_Session_SaveHandler_DbTable"
- resources.session.saveHandler.options.name = "session"
- resources.session.saveHandler.options.primary.session_id = "session_id"
- resources.session.saveHandler.options.primary.save_path = "save_path"
- resources.session.saveHandler.options.primary.name = "name"
- resources.session.saveHandler.options.primaryAssignment.sessionId = "sessionId"
- resources.session.saveHandler.options.primaryAssignment.sessionSavePath = "sessionSavePath"
- resources.session.saveHandler.options.primaryAssignment.sessionName = "sessionName"
- resources.session.saveHandler.options.modifiedColumn = "modified"
- resources.session.saveHandler.options.dataColumn = "session_data"
- resources.session.saveHandler.options.lifetimeColumn = "lifetime"
- ]]></programlisting>
- </sect2>
- </sect1>
|