El éxito de la web está profundamente arraigado en el protocolo que impulsa la web: HTTP. HTTP sobre TCP es por su propia naturaleza sin estado (stateless), lo que significa que, en esencia, la web también carece de estado. Aunque este aspecto es uno de los factores dominantes por los que la web se ha convertido en un medio tan popular, también causa un problema interesante para los desarrolladores que desean usar la web como plataforma de aplicaciones.
El acto de interactuar con una aplicación web se define típicamente por la suma de todas las peticiones enviadas a un servidor web. Dado que puede haber muchos consumidores siendo atendidos simultáneamente, la aplicación debe decidir qué peticiones pertenecen a qué consumidor. Estas peticiones se conocen habitualmente como una "sesión".
En PHP, el problema de la sesión se resuelve mediante la extensión de sesiones, que
utiliza algún tipo de seguimiento de estado, típicamente cookies, y alguna forma de almacenamiento local que se
expone a través de la superglobal $_SESSION. En Zend Framework, el componente
Zend_Session añade valor a la extensión de sesiones de PHP
facilitando su uso y su integración dentro de aplicaciones orientadas a objetos.
El componente Zend_Session es tanto un gestor de sesiones como
una API para almacenar datos en un objeto de sesión para su
persistencia a largo plazo. La API de Zend_Session sirve para
gestionar las opciones y el comportamiento de una sesión, como las opciones, el inicio y la detención de una
sesión, mientras que Zend_Session_Namespace es el objeto real utilizado
para almacenar datos.
Aunque generalmente es una buena práctica iniciar una sesión dentro de un proceso de arranque, esto
en general no es necesario, ya que todas las sesiones se iniciarán automáticamente en la primera
creación de un objeto Zend_Session_Namespace.
Zend_Application es capaz de configurar
Zend_Session por usted como parte del
sistema Zend_Application_Resource. Para usar esto, suponiendo que su
proyecto utiliza Zend_Application para el arranque, tendría que añadir el
siguiente código a su archivo application.ini:
resources.session.save_path = APPLICATION_PATH "/../data/session" resources.session.use_only_cookies = true resources.session.remember_me_seconds = 864000
Como puede ver, las opciones que se pasan son las mismas opciones que cabría esperar encontrar en la extensión ext/session de PHP. Esas opciones configuran la ruta hacia los archivos de sesión donde se almacenarán los datos dentro del proyecto. Dado que los archivos INI pueden además usar constantes, lo anterior usará la constante APPLICATION_PATH y apuntará de forma relativa a un directorio de datos de sesión.
La mayoría de los componentes de Zend Framework que utilizan sesiones no necesitan nada más para usar
Zend_Session. Llegados a este punto, puede usar un componente que
consuma Zend_Session, o comenzar a almacenar sus propios datos dentro de una
sesión con Zend_Session_Namespace.
Zend_Session_Namespace es una clase simple que redirige datos a través de una
API fácil de usar hacia la superglobal $_SESSION gestionada por
Zend_Session. La razón por la que se llama
Zend_Session_Namespace es que en efecto crea un espacio de nombres para los datos
dentro de $_SESSION, permitiendo así que múltiples componentes y objetos almacenen y
recuperen datos de forma segura. En el siguiente código, exploraremos cómo construir un simple
contador de sesión incremental, comenzando en 1000 y reiniciándose a sí mismo después de 1999.
$mysession = new Zend_Session_Namespace('mysession');
if (!isset($mysession->counter)) {
$mysession->counter = 1000;
} else {
$mysession->counter++;
}
if ($mysession->counter > 1999) {
unset($mysession->counter);
}
Como puede ver arriba, el objeto de espacio de nombres de sesión utiliza los métodos mágicos __get, __set, __isset y __unset para permitirle interactuar de forma fluida y sin complicaciones con la sesión. La información almacenada en el ejemplo anterior se guarda en $_SESSION['mysession']['counter'].
Además, si quisiera usar el gestor de almacenamiento (save handler) DbTable
para Zend_Session, tendría que añadir el siguiente código a
su application.ini:
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"