我将活动记录存储用于 Rails 会话存储。
在很短的时间内,sessions
桌子的大小增加了很多。这些会话行在一段时间后如何转储。还是我应该在 24 小时内手动清除一次?
我将活动记录存储用于 Rails 会话存储。
在很短的时间内,sessions
桌子的大小增加了很多。这些会话行在一段时间后如何转储。还是我应该在 24 小时内手动清除一次?
在 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])
如果使用魔法宝石,可以参考魔法的配置。
ActiveRecord::SessionStore::Session.delete_all(["updated_at < ?", User.sorcery_config.remember_me_for.ago])
关于您的问题的一篇好博文: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 作业运行它。
当您调用reset_session
rails 时,将从会话表中删除该行。然而,并不是每个会话都会reset_session
调用它:如果用户在没有注销的情况下关闭浏览器,那么浏览器将丢弃会话 cookie,因此该会话行将永远不会被再次使用,但reset_session
不会被调用。
Rails 不会为你清除那些积累的垃圾——你可以在你认为合适的时候对它进行任何整理。在之前的作业中,我们使用运行删除旧会话行的 cronjob。
我建议使用 cron 作业或其他方式清除您的 Rails 会话。也许不是 24 小时,这取决于您希望用户会话可用多长时间。Rails 为此提供了一个 rake 任务
耙分贝:会话:清除