ruby-on-rails 如何清除Rails会话表

zujrkrfu  于 2023-11-20  发布在  Ruby
关注(0)|答案(5)|浏览(167)

我使用的是active record store for rails sessions store。
在很短的时间内,sessions表的大小增加了很多。这些会话行在一段时间后如何转储。或者我应该在24小时内手动清除它们一次?

mfpqipee

mfpqipee1#

在Rails 3.2中使用标准的ActiveRecord调用。对于日期,传递一个与“Remember me”持续时间相匹配的值。在我的示例中,这将清除所有两周内处于非活动状态的会话。

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

pod7payv

pod7payv2#

关于你的问题的一个很好的博客文章: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 job每天运行它。

eoigrqb6

eoigrqb63#

当你调用reset_session时rails会从会话表中删除那一行。但是并不是每个会话都会调用reset_session:如果用户没有注销就关闭了浏览器,那么浏览器会丢弃会话cookie,这样会话行就不会再被使用,但是reset_session不会被调用。
Rails不会为你清除那些堆积的杂物--你可以自己决定是否做一些你认为合适的家务。在前面的一个任务中,我们使用cronjob来删除旧的会话行。

pcww981p

pcww981p4#

不要运行SQL。已经有一个rake任务可以完成这个任务。

bin/rake db:sessions:trim

字符串
运行bin/rake db:sessions:trim将删除最近30天内未更新的所有会话。
参见rails文档。https://github.com/rails/activerecord-session_store/blob/master/README.md?plain=1#L31-L36

ruyhziif

ruyhziif5#

我建议你使用cron作业之类的东西来清理你的rails会话。也许不是24小时,这取决于你想让用户会话可用多长时间。Rails为此提供了一个rake任务
rake db:会话:清除

相关问题