2012-04-10 7 views
18

Uso la tienda de discos activa para la tienda de sesiones de rieles.Cómo borrar carriles tablas tabla

En poco tiempo, el tamaño de la tabla sessions ha aumentado mucho. Cómo se vuelcan estas filas de sesión después de un cierto período de tiempo. ¿O debería borrarlos manualmente una vez cada 24 horas?

Respuesta

22

Un buen blog post acerca de su problema: http://blog.brightbox.co.uk/posts/clearing-out-rails-sessions

La solución es crear una tarea personalizada rastrillo:

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 

... y ejecutarlo cada día con una tarea programada.

+0

gracias, voy a usar esto. – Anand

+1

El equivalente de Postgres: 'sql =" ELIMINAR DE LAS SESIONES DONDE updated_at <(CURRENT_TIMESTAMP - INTERVALO '1 días'); "' – kgx

+0

Eso es genial. También recomendaría mantener sus sesiones en un db nosql en lugar de allí. Quizás Redis. Golpear el DB real es demasiado caro de un viaje – lsaffie

0

Recomendaría borrar sus sesiones de rieles usando un trabajo cron o algo así. Quizás no 24 horas, depende de por cuánto tiempo quieres que estén disponibles las sesiones de los usuarios. Rieles proporciona una tarea rastrillo para este

rake db: sesiones: claro

+1

AFAIK esta tarea también elimina las sesiones activas. –

+4

Correcto, esta tarea de rastreo arrojará TODAS las sesiones –

+2

, esto podría ser dañino, no lo use. – matanco

6

Cuando se llama a reset_session rieles, se eliminará esa fila de la tabla de sesiones. Sin embargo, no todas las sesiones tendrán que llamar al reset_session: si un usuario cierra su navegador sin cerrar sesión, el navegador descartará la cookie de sesión, de modo que la fila de la sesión nunca volverá a utilizarse, pero reset_session no se invocará.

Los rieles no despejarán esa acumulación de residuos para usted; le corresponde a usted realizar cualquier tarea doméstica sobre ella como mejor le parezca. En un trabajo anterior, utilizamos para ejecutar un cronjob que eliminó las filas de la sesión anterior.

+0

Esto es correcto. Si elimina su cookie de sesión en el navegador, esa fila de sesión también quedará en la tabla. –

31

Use una llamada estándar a ActiveRecord en Rails 3.2. Para la fecha, pase un valor que coincida con la duración de su duración "Recordarme". En mi ejemplo, esto borrará TODAS las sesiones que han estado inactivas durante dos semanas.

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

Como se indica por @journeyer a continuación, si se utiliza la gema Devise, se puede hacer referencia a la configuración de la Devise'.

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

Si usa la gema de Hechicería, se puede hacer referencia a la configuración de la Hechicera.

ActiveRecord::SessionStore::Session.delete_all(["updated_at < ?", User.sorcery_config.remember_me_for.ago]) 
+2

Si usa Devise, puede obtener la duración remember_for con 'Devise.remember_for'' ActiveRecord :: SessionStore :: Session.delete_all (["updated_at journeyer

+3

Lo sentimos, lo anterior debería ser: ActiveRecord :: SessionStore :: Session.delete_all (["updated_at journeyer

+0

esta es una respuesta mucho más clara que las demás. – nfriend21