| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- EN-Revision: 24249 -->
- <!-- 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:
- <acronym>HTTP</acronym>. <acronym>HTTP</acronym> ü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 <classname>Zend_Session</classname> 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 <classname>Zend_Session</classname> 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
- <classname>Zend_Session</classname> ist für das Managen der Optionen und des Verhaltens
- einer Session, wie Optionen, Starten und Stoppen einer Session, und
- <classname>Zend_Session_Namespace</classname> 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
- <classname>Zend_Session_Namespace</classname> Objekts automatisch gestartet werden.
- </para>
- <para>
- <classname>Zend_Application</classname> ist in der Lage
- <classname>Zend_Session</classname> als Teil des
- <classname>Zend_Application_Resource</classname> Systems zu konfigurieren. Um das zu
- verwenden, nehmen wir an dass das Projekt <classname>Zend_Application</classname> 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 <acronym>INI</acronym> 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 <classname>Zend_Session</classname> zu verwenden. An diesem Punkt
- verwendet man entweder eine Komponente welche <classname>Zend_Session</classname>
- verwendet, oder startet das Speichern eigener Daten in einer Session mit
- <classname>Zend_Session_Namespace</classname>.
- </para>
- <para>
- <classname>Zend_Session_Namespace</classname> ist eine einfache Klasse welche auf Daten
- über eine einfach zu verwendende <acronym>API</acronym> in der von
- <classname>Zend_Session</classname> gemanagten superglobalen $_SESSION verweist. Der
- Grund warum es <classname>Zend_Session_Namespace</classname> 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 <classname>Zend_Session</classname>
- 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>
|