我正在开发一个现有的Rails 2应用程序。我已经将一些哈希数据结构转换为对象,如果我在会话存储中放置一个,它似乎破坏了会话,清除了user_id等等,并强制进行另一次登录。我正在使用dalli_store进行会话。
以下代码会导致会话被清除:
bug = MyClass.get_an_object()
session[:debug] = bug
目前尚不清楚它何时会被消灭。我可以在调试器中逐步完成渲染视图,会话很好,但当我在UI中点击另一个链接时,session
为空(Hash [0]),我被重定向到登录页面。
如果我稍微更改了代码,那么会话就可以了:
bug = MyClass.get_an_object()
session[:debug] = Marshal::dump(bug)
但是,如果我存储实际对象(甚至是深层副本),会话将丢失。即即使这不起作用:
session[:debug] = Marshal::load( Marshal::dump(bug) )
当编组时,bug.size大约是140K,所以它不应该超过memcached。无论如何,我会假设会话由Marshal::dump()
序列化,因此大小应该相同。如果我在存储它后访问会话中的对象并不重要。只是将它放入会话就足以引起问题,但正如我所说,在存储对象之后,会话一直很好,并且一直通过视图渲染。直到下一个请求的开始,我才发现它已经被破坏了。
我很难过。
您对如何调试有任何建议吗?目前,我想我可以明确地调用Marshal来保存对象,但我真的很想理解为什么会话被破坏了。
我知道将大型对象放入会话是一件坏事,但修复问题的这一部分超出了当前项目的范围......可能以后。另外,我对这里发生的事情非常好奇。