解决Session文件载入出错问题

今天早上突然出现网页显示错误,察看log文件发现如下错误信息:

Session contains objects whose class definition isn't available.
Remember to require the classes for all objects kept in the session.

首先简单介绍一下这个网站的结构:

网站架构: Ruby/Rails
部署平台: Apache2

分析原因:
网站有多个Controller, 其中一个Controller Require了一个类,new了一个对象然后将这个对象保存到Session里面,然后我跳转到另一个Controller的页面,在这个Controller中没有Require这个类,在页面中的JavaScript代码会通过Ajax定时不断调用Controller的一个方法,这个时候页面显示还一切正常,但是今天早上Apache强制所有的fcgi process重新启动,这个时候错误就发生了,因为没有Require那个类,但Session文件并没有变化(因为对浏览器而言还是同一个Session),所以一旦尝试载入Session文件就报上述错误并返回错误页面。

解决方案:
将对这个类的Require代码从一个特定的Controller移到所有Controller的父类文件application.rb。

收获:
经过这次调试发现原来Rails的Session文件实际采用的是Marshal库。如果你想直接察看Session中的内容,可以参照以下方式:

irb(main):002:0> require 'rubygems'
=> true
irb(main):003:0> require 'initializer'
=> true
irb(main):004:0> session = Marshal.load(File.open('tmp/sessions/ruby_sess.01f1a5de37e91f4c'))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值