2009-10-28 7 views
5

Esta es mi mesa:Sesiones Almacenamiento en DB tabla que no trabaja (usando Zend_Session_SaveHandler_DbTable)

CREATE TABLE `Sessions` (
`id` varchar(32) NOT NULL, 
`modified` int(11) default NULL, 
`lifetime` int(11) default NULL, 
`data` text, 
PRIMARY KEY (`id`) 
) ENGINE=InnoDB 

Esto está en mi archivo de arranque:

$sessionConfig = array( 
'name'   => 'Sessions',  //table name as per Zend_Db_Table 
'primary'  => 'id', //the sessionID given by php 
'modifiedColumn' => 'modified',  //time the session should expire 
'dataColumn'  => 'data', //serialized data 
'lifetimeColumn' => 'lifetime'  //end of life for a specific record 
); 
$saveHandler = new Zend_Session_SaveHandler_DbTable($sessionConfig); 
//cookie persist for 30 days 
Zend_Session::rememberMe($seconds = (60 * 60 * 24 * 30)); 

//make the session persist for 30 days 
$saveHandler->setLifetime($seconds) 
    ->setOverrideLifetime(true); 
//similarly, 
//$saveHandler->setLifetime($seconds, true); 
Zend_Session::setSaveHandler($saveHandler); 
Zend_Session::start(); 

Cuando me conecto, nunca nada se escribe a la Tabla de sesiones y estoy desconectado en la siguiente página vista.

¿Alguna idea? Estoy intentando que mis usuarios se conecten perpetuamente. ¿Estoy perdiendo algo en mi controlador de inicio de sesión posiblemente?

Respuesta

0

Tal vez tenga que poner Zend_Session::start(); antes que cualquier otra cosa en la página ...?

+0

He leído que quieres llamar a Zend_Session :: start(); después de todo lo demás. Una de las razones por las que session_set_cookie_params() a la que se llama desde rememberMe() no puede establecer la duración después de que se inicia la sesión. – Brian

+0

Aún así, si configura'Zend_Session :: start(); 'antes que nada, ¿funciona? Eso podría darnos algunas pistas sobre lo que puede estar interfiriendo. – Frankie

+0

Poniendo Zend_Session :: start(); antes, todo parece producir el mismo resultado. ¿Algunas ideas? – Brian

1

Debe inicializar su manejador de base de datos antes de decirle a Zend_Session que use DB, ya sea configurando un adaptador predeterminado para Zend_Db, o pasando su adaptador en la matriz de configuración como 'db'.

2

yo sólo lograron conseguir este trabajo:

Mi application.ini:

resources.db.isDefaultTableAdapter = true 
resources.db.adapter = "pdo_mysql" 
resources.db.params.host = "localhost" 
resources.db.params.dbname = "dbname" 
resources.db.params.username = "username" 
resources.db.params.password = "password" 

mi Bootstrap.php:

protected function _initSession() { 
    $resource = $this->getPluginResource('db'); 
    $dbAdapter = $db = $resource->getDbAdapter(); 
    Zend_Registry::set("db", $dbAdapter); 
    Zend_Db_Table_Abstract::setDefaultAdapter($dbAdapter); 
    $config = array(
     'name' => 'session', 
     'primary' => 'id', 
     'modifiedColumn' => 'modified', 
     'dataColumn' => 'data', 
     'lifetimeColumn' => 'lifetime', 
     'db' => $dbAdapter 
    ); 

    Zend_Session::setSaveHandler(new Zend_Session_SaveHandler_DbTable($config)); 
    Zend_Session::start(); 
} 

Esta función se colocó como primera función en el arranque .php, porque las sesiones se inician cuando construyes un objeto Zend_Session_Namespace por primera vez. Si hace esto, antes de que se llame a la función _initSession(), se puede iniciar una sesión estándar basada en archivos.

Por último, el session.sql:

DROP TABLE IF EXISTS `session`; 


CREATE TABLE `session` (

    `id` char(32) NOT NULL DEFAULT '', 

    `modified` int(11) DEFAULT NULL, 

    `lifetime` int(11) DEFAULT NULL, 

    `data` text, 

    PRIMARY KEY (`id`) 

) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

alguna parte leí que la mesa debe ser InnoDB.

+0

No necesita ambos Zend_Db_Table_Abstract :: setDefaultAdapter ($ dbAdapter); y 'db' => $ dbAdapter – Kicsi

0

Tenía el mismo problema con una implementación de redis como controlador de sesión.

Para mí, poner el método _initSession como primer método en mi clase de arranque funciona.

Espero que ayude a alguien.

Cuestiones relacionadas