2010-09-18 69 views
1

我正在使用Zend_Session_SaveHandler_DbTable将我的会话存储在数据库中。我在我的application.ini中有以下内容无法在Zend_Application中使用Zend_Auth和Zend_Session_SaveHandler_DbTable

resources.session.save_path = APPLICATION_PATH "/../data/sessions" 
resources.session.use_only_cookies = true 
resources.session.remember_me_seconds = 864000 
resources.session.saveHandler.class = "Zend_Session_SaveHandler_DbTable" 
resources.session.saveHandler.options.name = "session" 
resources.session.saveHandler.options.primary.session_id = "session_id" 
resources.session.saveHandler.options.primary.save_path = "save_path" 
resources.session.saveHandler.options.primary.name = "name" 
resources.session.saveHandler.options.primaryAssignment.session_id = "sessionId" 
resources.session.saveHandler.options.primaryAssignment.save_path = "sessionSavePath" 
resources.session.saveHandler.options.primaryAssignment.name = "sessionName" 
resources.session.saveHandler.options.modifiedColumn = "modified" 
resources.session.saveHandler.options.dataColumn = "session_data" 
resources.session.saveHandler.options.lifetimeColumn = "lifetime" 
resources.session.saveHandler.options.userIdColumn = "user_id" 

会话似乎在数据库中正确保存。

的问题是,当我叫Zend_Auth的::的getInstance() - > hasIdentity()的应用程序,它最终将调用过Zend_Session :: start(真),这将导致错误:

Fatal error: Uncaught exception 'Zend_Session_Exception' with message 'session has already been started by session.auto-start or session_start()' in C:\Program Files (x86)\Zend\Apache2\htdocs\myapp\library\Zend\Session.php:462 Stack trace: #0 C:\Program Files (x86)\Zend\Apache2\htdocs\myapp\library\Zend\Session\Namespace.php(143): Zend_Session::start(true) #1 C:\Program Files (x86)\Zend\Apache2\htdocs\myapp\library\Zend\Auth\Storage\Session.php(87): Zend_Session_Namespace->__construct('Zend_Auth') #2 C:\Program Files (x86)\Zend\Apache2\htdocs\myapp\library\Zend\Auth.php(91): Zend_Auth_Storage_Session->__construct() #3 C:\Program Files (x86)\Zend\Apache2\htdocs\myapp\library\Zend\Auth.php(141): Zend_Auth->getStorage() #4 C:\Program Files (x86)\Zend\Apache2\htdocs\myapp\application\modules\default\views\scripts\layout.phtml(29): Zend_Auth->hasIdentity() #5 C:\Program Files (x86)\Zend\Apache2\htdocs\myapp\library\Zend\View.php(108): include('C:\Prog in C:\Program Files (x86)\Zend\Apache2\htdocs\myapp\library\Zend\Session.php on line 462

因为Zend_Session_SaveHandler_DbTable已经启动了会话。我虽然Zend_Session_SaveHandler_DbTable会自动让Zend_Auth将会话信息存储在数据库中。

有什么我在这里丢失或没有正确配置?

+0

待办事项你可以在任何地方调用'Zend_Session :: start'吗?或者这是由一个ZF类完成的? – 2010-09-18 15:24:07

+0

我不会在任何地方手动调用它。它被Zend_Auth在获取会话存储时调用 – Christopher 2010-09-18 18:20:48

+0

错误消息意味着ZF之外的某些东西正在启动会话 - 您可以检查phpinfo()以查看是否有session.auto-start设置为on,或者您是否拥有应用中可能使用会话的任何其他PHP脚本? – 2010-09-18 20:15:15

回答

0

的文档(http://framework.zend.com/manual/en/zend.application.available-resources.html#zend.application.available-resources.session)是不正确的设置在的application.ini

保存处理程序应该是:

resources.session.save_path = APPLICATION_PATH "/../data/sessions" resources.session.use_only_cookies = true resources.session.remember_me_seconds = 864000 resources.session.saveHandler.class = "Zend_Session_SaveHandler_DbTable" resources.session.saveHandler.options.name = "session" resources.session.saveHandler.options.primary[] = "session_id" resources.session.saveHandler.options.primary[] = "save_path" resources.session.saveHandler.options.primary[] = "name" resources.session.saveHandler.options.primaryAssignment[] = "sessionId" resources.session.saveHandler.options.primaryAssignment[] = "sessionSavePath" resources.session.saveHandler.options.primaryAssignment[] = "sessionName" resources.session.saveHandler.options.modifiedColumn = "modified" resources.session.saveHandler.options.dataColumn = "session_data" resources.session.saveHandler.options.lifetimeColumn = "lifetime"

我已经提交了ZF的问题:http://framework.zend.com/issues/browse/ZF-10471