19

Railsセッションストアにはアクティブなレコードストアを使用しています。

ほんの少しの間に、sessionsテーブルのサイズが大幅に増加しました。これらのセッション行は、一定期間後にどのようにダンプされますか。または、24 時間に 1 回手動でクリアする必要がありますか?

4

4 に答える 4

35

Rails 3.2 で ActiveRecord への標準呼び出しを使用します。日付には、「Remember me」期間の長さに一致する値を渡します。私の例では、これにより、2 週間非アクティブだったすべてのセッションがクリアされます。

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

Sorcery gem を使用している場合は、Sorcery の構成を参照できます。

ActiveRecord::SessionStore::Session.delete_all(["updated_at < ?", User.sorcery_config.remember_me_for.ago])
于 2013-07-20T12:57:50.337 に答える
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ジョブで毎日実行します。

于 2012-04-10T12:22:10.650 に答える
7

Railsを呼び出すとreset_session、セッション テーブルからその行が削除されます。ただし、すべてのセッションでreset_session呼び出されるわけではありません。ユーザーがログアウトせずにブラウザーを閉じると、ブラウザーはセッション Cookie を破棄するため、そのセッション行は二度と使用されreset_sessionませんが、呼び出されません。

Rails は、蓄積された残骸をあなたに代わって片付けることはありません。以前のジョブでは、古いセッション行を削除する cron ジョブを実行するために使用しました。

于 2012-04-10T12:20:44.057 に答える
-1

cron ジョブなどを使用して Rails セッションをクリアすることをお勧めします。24 時間ではないかもしれませんが、ユーザー セッションを利用できる期間によって異なります。Rails はこのための rake タスクを提供します

rake db:sessions:clear

于 2012-04-10T12:20:31.123 に答える