当出现cookie溢出问题时,我使用以下stackoverflow应答来利用活动记录存储并创建会话表。
Cookie overflow in rails application?
但是,现在我已达到Heroku数据库限制,因为每个会话都在创建一行。
有没有办法让会话过期并在一段时间后删除?我错过了一个未包含在stackoverflow答案中的步骤吗?
感谢您的帮助!
答案 0 :(得分:2)
我在大约一年前碰到了一个非常类似的问题,我的解决方案是编写一个rake任务,每隔一段时间使用Heroku scheduler free add-on运行一次。这是rake的任务:
namespace :maintenance do
desc "Cleanup stale sessions (optional ENV[\"BEFORE_DATE\"] = yyyy/mm/dd)"
task :clear_stale_sessions => :environment do
before_date = ENV["BEFORE_DATE"] || 1.week.ago
start_timestamp = Time.now
if Rails.env.production?
puts "#{start_timestamp} -- Beginning deleting of stale sessions before #{before_date}..."
else
Rails.logger.info "#{start_timestamp} -- Beginning deleting of stale sessions before #{before_date}..."
end
deleted_session_count = ActiveRecord::SessionStore::Session.delete_all(["updated_at <= ?", before_date])
finished_timestamp = Time.now
current_session_count = ActiveRecord::SessionStore::Session.count
if Rails.env.production?
puts "#{Time.now} -- Finished deleting of stale sessions before #{before_date} -- Deleted Sessions: #{deleted_session_count} - Current Sessions: #{current_session_count} -- Time: #{(finished_timestamp - start_timestamp)} seconds."
else
Rails.logger.info "#{Time.now} -- Finished deleting of stale sessions before #{before_date} -- Deleted Sessions: #{deleted_session_count} - Current Sessions: #{current_session_count} -- Time: #{(finished_timestamp - start_timestamp)} seconds."
end
end
end
基本思想是删除超过一周的任何会话信息,但您可以使用Heroku中的BEFORE_DATE
环境变量将其更改为您希望的任何值。请注意,在第一次运行时,这可能需要相当长的时间,具体取决于您有多少陈旧会话,但后续运行应该更快。
我每天早上都会这样运行(再次使用Scheduler附加组件),它会大大降低我的数据库大小。我还为这个rake任务添加了一些日志记录,因此我可以快速查看它是如何进行的,而无需定期观看。如果您愿意,可以将其删除。
重要的是要注意,如果您将所有Heroku dyno小时数用于您的应用程序,则调度程序将导致您的信用卡收取一些dyno小时费用。换句话说,加载项是免费的,但的使用可能不是。