Хранение сеансов в таблице БД не работает (используется Zend_Session_SaveHandler_DbTable) - PullRequest
5 голосов
/ 28 октября 2009

Это мой стол:

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

Это у меня в начальной загрузке:

$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(); 

Когда я вхожу, в таблицу Sessions ничего не записывается, и я выхожу из системы при следующем просмотре страницы.

Есть идеи? Я пытаюсь, чтобы мои пользователи постоянно входили в систему. Возможно, я что-то упустил в контроллере входа?

Ответы [ 4 ]

2 голосов
/ 01 мая 2011

Мне только удалось заставить это работать:

My 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"

my 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();
}

Эта функция была помещена в качестве первой функции в bootstrap.php, поскольку сеансы запускаются, когда вы впервые создаете объект Zend_Session_Namespace. Если вы сделаете это, перед вызовом функции _initSession () - может быть запущена стандартная файловая сессия.

Наконец, 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;

Где-то я читал, что таблица должна быть InnoDB.

1 голос
/ 11 ноября 2009

Вы должны инициализировать обработчик БД перед тем, как сообщить Zend_Session об использовании БД, либо установив адаптер по умолчанию для Zend_Db, либо передав свой адаптер в массив конфигурации как 'db'.

0 голосов
/ 19 февраля 2014

У такой же проблемы с реализацией redis, как и у обработчика сеанса.

Для меня установка метода _initSession в качестве первого метода в моем классе начальной загрузки работает.

Надеюсь, это кому-нибудь поможет.

0 голосов
/ 28 октября 2009

Может быть, вам нужно поставить Zend_Session::start();, прежде чем что-либо еще на странице ...?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...