2012-12-19 42 views
2

我試圖建立我自己的Zend_Session_SaveHandler基於此代碼 http://blog.digitalstruct.com/2010/10/24/zend-framework-cache-backend-libmemcached-session-cache/Zend_Session_SaveHandler_Interface和SESSION_ID mysterie

這個偉大的工程,但我的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

好的,我在這裏臉紅了...... 我在錯誤的地方看到這個錯誤。我的會話saveHandler工作得很好(所以如果你想要libmemcached會話管理,我可以推薦Mike Willbanks his work)。

然後出了什麼問題?那麼,除了從文件切換到libmemcached之外,我還從在bootstrap中設置會話轉到在我的application.ini中設置它。因此,而不是把線像

session.cookie_domain = mydomain.com 

在我的application.ini(然後將其在啓動時使用的選項設置我的會話),我現在,正確,寫

resources.session.cookie_domain = mydomain.com 

這是事情出錯了,因爲......我只是改變了生產線,我忘了在ini文件中進一步改變它們。換句話說,我的發展環境。得到了我的生產環境的cookie_domain,這是錯誤的,因爲我在開發過程中使用了其他域名。因此,在每次加載頁面時,我的cookie都無效,並開始一個新的會話。 Mysterie解決了...