如何清除rails会话表
我使用活动记录存储为rails会话存储。
在短时间内, sessions
表的大小增加了很多。 如何在一段时间后转储这些会话行。 或者我应该在24小时内手动清除它们一次?
关于你的问题的一篇好博文: http : //blog.brightbox.co.uk/posts/clearing-out-rails-sessions
解决方案是创建自定义rake任务:
task :clear_expired_sessions => :environment do sql = 'DELETE FROM sessions WHERE updated_at < DATE_SUB(NOW(), INTERVAL 1 DAY);' ActiveRecord::Base.connection.execute(sql) end
......每天用cron工作来运行它。
在Rails 3.2中使用对ActiveRecord的标准调用。 对于日期,传递一个与“记住我”持续时间长度相匹配的值。 在我的示例中,这将清除已停用两周的所有会话。
ActiveRecord::SessionStore::Session.delete_all(["updated_at < ?", 2.weeks.ago])
如下面的@journeyer所述,如果使用Devise gem,可以参考Devise的配置。
ActiveRecord::SessionStore::Session.delete_all(["updated_at < ?", Devise.remember_for.ago])
如果使用Sorcerygem,可以参考Sorcery的配置。
ActiveRecord::SessionStore::Session.delete_all(["updated_at < ?", User.sorcery_config.remember_me_for.ago])
当您调用reset_session
rails将从会话表中删除该行。 但是并非每个会话都会调用reset_session
:如果用户在没有注销的情况下关闭浏览器,则浏览器将丢弃会话cookie,因此会话行将永远不会再次使用,但不会调用reset_session
。
Rails不会清除那些累积残余物 – 你可以根据自己的需要对它进行任何管理。 在之前的作业中,我们使用运行删除旧会话行的cronjob。
我建议使用cron作业清除rails会话。 也许不是24小时,取决于您希望用户会话可用多长时间。 Rails为此提供了一个rake任务
rake db:sessions:clear