Zend_Session_SaveHandler_Interface和session_id mysterie

时间:2012-12-19 15:01:30

标签: zend-framework zend-session libmemcached

我正在尝试根据此代码设置自己的Zend_Session_SaveHandler http://blog.digitalstruct.com/2010/10/24/zend-framework-cache-backend-libmemcached-session-cache/

这很有效,除了我的session_id行为神秘。 我正在使用Zend_Session_SaveHandler_Cache类,因为你可以在上面的博客中找到它(除了我将它停放在我自己的库中,所以它的名字现在以My _开头)。

在我的训练中,我有:

protected function _initSession()
{            
    $session = $this->getPluginResource('session');
    $session->init();    
    Zend_Session::getSaveHandler()->setCache( $this->_manager->getCache( 'memcached' ) );
}

根据我的.ini文件中的代码

进行会话
resources.cachemanager.memcached.frontend.name                            = Core
resources.cachemanager.memcached.frontend.options.automatic_serialization = On
resources.cachemanager.memcached.backend.name                             = Libmemcached
resources.cachemanager.memcached.backend.options.servers.one.host         = localhost
resources.cachemanager.memcached.backend.options.servers.one.port         = 11213

到目前为止一切顺利。直到有人试图登录并调用Zend_Session :: rememberMe()。在Zend_Session的评论中,可以阅读

  

通常“rememberMe()”表示安全上下文更改,因此   应该使用新的会话ID

这当然是非常正确的,并且会生成一个新的会话ID。登录成功后,用户Zend_Auth数据将写入此新会话。我可以看到这个,因为我从博客中为原始类添加了一些日志记录功能。

这里出了问题。这个新的id显然没有在Zend_Session上传递,因为Zend_Session继续读取旧id的会话数据。换句话说,没有Zend_Auth实例的那个。因此,用户无法再登录。

所以问题是,如何让我的saveHandler在重新生成后使用新的id工作? 欢呼任何帮助。

1 个答案:

答案 0 :(得分:2)

好的,我在这里脸红了.... 我正在寻找错误的地方找到这个错误。我的会话saveHandler运行得很好(如果你想要libmemcached会话管理,我可以推荐Mike Willbanks his work。)

那出了什么问题呢?好吧,除了从文件切换到libmemcached之外,我还从设置我在bootstrap中的会话切换到在我的application.ini中设置它。所以,而不是像

那样放线
session.cookie_domain = mydomain.com

在我的application.ini中(然后在bootstrap中用作设置会话的选项),我现在正确地写了

resources.session.cookie_domain = mydomain.com

这就是出了问题,因为......我只是改变了那些生产线,我忘了将它们更改为ini文件。换句话说,我的发展环境。得到了我的生产环境的cookie_domain,这是错误的,因为我在devolepment期间使用其他域名。因此,在每次加载页面时,我的cookie都被无效并启动了新会话。 Mysterie解决了......