我正在尝试根据此代码设置我自己的 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 呢?为任何帮助而欢呼。