Railsセッションストアにはアクティブなレコードストアを使用しています。
ほんの少しの間に、sessions
テーブルのサイズが大幅に増加しました。これらのセッション行は、一定期間後にどのようにダンプされますか。または、24 時間に 1 回手動でクリアする必要がありますか?
Railsセッションストアにはアクティブなレコードストアを使用しています。
ほんの少しの間に、sessions
テーブルのサイズが大幅に増加しました。これらのセッション行は、一定期間後にどのようにダンプされますか。または、24 時間に 1 回手動でクリアする必要がありますか?
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])
あなたの問題に関する良いブログ投稿: 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ジョブで毎日実行します。
Railsを呼び出すとreset_session
、セッション テーブルからその行が削除されます。ただし、すべてのセッションでreset_session
呼び出されるわけではありません。ユーザーがログアウトせずにブラウザーを閉じると、ブラウザーはセッション Cookie を破棄するため、そのセッション行は二度と使用されreset_session
ませんが、呼び出されません。
Rails は、蓄積された残骸をあなたに代わって片付けることはありません。以前のジョブでは、古いセッション行を削除する cron ジョブを実行するために使用しました。
cron ジョブなどを使用して Rails セッションをクリアすることをお勧めします。24 時間ではないかもしれませんが、ユーザー セッションを利用できる期間によって異なります。Rails はこのための rake タスクを提供します
rake db:sessions:clear