如何清除 Rails 会话表

问题描述 投票:0回答:5

我使用活动记录存储作为 Rails 会话存储。

短短的时间里,

sessions
桌子的大小就增加了很多。一段时间后如何转储这些会话行。或者我应该每 24 小时手动清除一次?

ruby-on-rails ruby-on-rails-3
5个回答
35
投票

在 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])

23
投票

关于您的问题的一篇很好的博客文章: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 作业运行它。


7
投票

当您调用

reset_session
时,rails 将从会话表中删除该行。然而,并不是每个会话都会调用
reset_session
:如果用户在没有注销的情况下关闭浏览器,那么浏览器将丢弃会话 cookie,因此该会话行将永远不会再次使用,但
reset_session
不会被调用.

Rails 不会为您清除堆积的垃圾 - 您可以根据自己的需要进行任何整理工作。在之前的工作中,我们用来运行一个删除旧会话行的 cronjob。


0
投票

不要运行 SQL。已经有一个 rake 任务了。

bin/rake db:sessions:trim

运行

bin/rake db:sessions:trim
将删除所有未删除的会话 过去 30 天内更新过。


-1
投票

我建议使用 cron 作业或其他方式清除 Rails 会话。也许不是 24 小时,具体取决于您希望用户会话可用的时间。 Rails 为此提供了一个 rake 任务

rake 数据库:会话:清除

© www.soinside.com 2019 - 2024. All rights reserved.