我使用活动记录存储作为 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。
不要运行 SQL。已经有一个 rake 任务了。
bin/rake db:sessions:trim
运行
bin/rake db:sessions:trim
将删除所有未删除的会话
过去 30 天内更新过。
我建议使用 cron 作业或其他方式清除 Rails 会话。也许不是 24 小时,具体取决于您希望用户会话可用的时间。 Rails 为此提供了一个 rake 任务
rake 数据库:会话:清除