今天早上突然出现网页显示错误,察看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中的内容,可以参照以下方式:
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'))