今天早上突然出现网页显示错误,察看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'))
分享到:
相关推荐
- 选中文件时,移动到屏幕可视区域(解决上下左右选中文件滚动条不一致问题) ###ver2.51 `2014/6/22` ---- ####fix bug:(bug解决和程序优化) - 登陆多次密码输入错误验证码bug解决 - 修复漏洞:创建副本加入...
- **文件说明**:此文件用于在初始化时载入check参数,以确定是否开启访问控制功能。该功能主要用于开发调试阶段,生产环境中通常关闭此功能。 - **关键代码**: ```java public static void checkSession...
注意:该事件在Linux版本的Flash Player中存在问题,目前还无法解决。 - 传入参数 file object:文件对象 bytes complete:已经上传完毕的文件字节数 total bytes:文件总体积的字节数 [编辑本段]常见错误...
- 将`HungAppTimeout`的数值从5000修改为200(即程序出错时等待0.5秒)。 3. **修改服务关闭等待时间**: - 路径`HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control`。 - 将`WaitToKillServiceTimeout`的...
options:该参数可以省略,指定包含时的选项,包含encoding和parse两个选项,其中encoding指定包含页面时所用的解码集,而parse指定被包含文件是否作为FTL文件来解析,如果省略了parse选项值,则该选项默认是true. ...