<?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>
