【问题标题】:Storing Sessions in DB Table Not Working (using Zend_Session_SaveHandler_DbTable)在数据库表中存储会话不起作用(使用 Zend_Session_SaveHandler_DbTable)
【发布时间】:2010-12-10 22:09:07
【问题描述】:

这是我的桌子:

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 表,并且我在下一个页面浏览时退出。

有什么想法吗?我正在尝试让我的用户永久登录。我的登录控制器中是否可能缺少某些内容?

【问题讨论】:

    标签: php mysql database zend-framework session


    【解决方案1】:

    我刚刚设法让这个工作:

    我的应用程序.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"
    

    我的 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。

    【讨论】:

    • 你不需要 Zend_Db_Table_Abstract::setDefaultAdapter($dbAdapter);和 'db' => $dbAdapter
    【解决方案2】:

    在告诉 Zend_Session 使用 DB 之前,您必须初始化您的 DB 处理程序,方法是为 Zend_Db 设置默认适配器,或者将配置数组中的适配器作为 'db' 传递。

    【讨论】:

      【解决方案3】:

      也许您必须将Zend_Session::start(); 放在页面上其他任何内容之前...?

      【讨论】:

      • 我读到你想调用 Zend_Session::start();在一切之后。一个原因是从 rememberMe() 调用的 session_set_cookie_params() 无法设置会话启动后的生命周期。
      • 即便如此,如果你在其他任何事情之前设置“Zend_Session::start();”,它会起作用吗?这可以为我们提供一些可能干扰的线索。
      • 把 Zend_Session::start();之前的一切似乎都产生了相同的结果。有什么想法吗?
      【解决方案4】:

      在将 redis 实现为会话处理程序时遇到了同样的问题。

      对我来说,将方法 _initSession 作为我的引导类中的第一个方法是可行的。

      希望对某人有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-04-29
        • 1970-01-01
        • 1970-01-01
        • 2012-05-28
        • 1970-01-01
        • 2015-03-25
        • 2012-11-12
        • 1970-01-01
        相关资源
        最近更新 更多