Вопрос по ruby-on-rails-3, ruby-on-rails – Как очистить таблицу сессий рельсов

18

Я использую активное хранилище записей для хранения сессий рельсов.

В течение короткого времени, размерsessions стол сильно увеличился. Как эти строки сеанса сбрасываются после определенного периода времени. Или я должен вручную очистить их один раз в 24 часа?

Ваш Ответ

4   ответа
6

reset_session rails удалит эту строку из таблицы сеансов. Однако не каждая сессия будет иметьreset_session вызывается: если пользователь закрывает свой браузер, не выходя из системы, браузер отбрасывает cookie-файл сеанса, поэтому строка сеанса больше никогда не будет использоваться, ноreset_session не будет называться.

Rails не прояснит, что для вас накапливается фуфло - вы сами можете вести уборку на нем так, как считаете нужным. В предыдущем задании мы использовали для запуска cronjob, который удалял старые строки сеанса.

Это правильно. Если вы удалите куки сеанса в браузере, эта строка сеанса также останется в таблице.
32

айте значение, соответствующее длине вашего & quot; Запомнить меня & quot; продолжительность. В моем примере это очистит ВСЕ сеансы, которые были неактивными в течение двух недель.

ActiveRecord::SessionStore::Session.delete_all(["updated_at < ?", 2.weeks.ago])

Как указано @journeyer ниже, при использовании драгоценного камня Devise можно ссылаться на Devise & apos; конфигурации.

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])
это гораздо более четкий ответ, чем другие.
Извините, выше должно быть: ActiveRecord :: SessionStore :: Session.delete_all ([& quot; updated_at & lt;? & Quot ;, Devise.remember_for.ago])
Если вы используете Devise, вы можете запомнитьDevise.remember_for ActiveRecord::SessionStore::Session.delete_all(["updated_at < ?", Devise.remember_for])
Сессионные куки-файлы и постоянные куки-файлы отличаются и не должны сравниваться.Devise.remember_for период времени для постоянного куки и не является сеансом (который существует независимо от того, вошли вы в систему или нет). По умолчанию это 2 недели, но могут быть годы. Сеансы, с другой стороны, длятся только до тех пор, пока вы не закроете браузер. 2 недели вполне достаточно.
0

используя работу cron или что-то. Может быть, не 24 часа, зависит от того, как долго вы хотите, чтобы пользовательские сессии были доступны. Rails предоставляет для этого грабли

rake db:sessions:clear

Правильно, эта грабельная задача отбросит ВСЕ сеансы
AFAIK эта задача также отбрасывает активные сеансы.
это может быть вредно, не используйте его.
22

http://blog.brightbox.co.uk/posts/clearing-out-rails-sessions

Решение состоит в том, чтобы создать пользовательскую задачу граблей:

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.

Эквивалент Postgres:sql = "DELETE FROM sessions WHERE updated_at < (CURRENT_TIMESTAMP - INTERVAL '1 days');"
Это хорошо работает, но если ваша установка Rails использует MongoDB для хранения БД через Mongoid, это не сработает. Но разработали ответ, который будетhelp users using Rails 3, Mongoid & MongoDB over here.
Это здорово. Я бы также рекомендовал хранить ваши сессии в базе данных nosql, а не там. Возможно, Redis. Удар по фактической базе данных слишком дорогой для поездки

Похожие вопросы