【问题标题】:Rails store session on filesystemRails 在文件系统上存储会话
【发布时间】:2014-01-18 09:30:34
【问题描述】:

我在使用 devise 的 rails 上遇到了 cookie 存储溢出问题,看来是时候使用不同的会话存储了。当然redis会解决问题,但我不想在开发机器上使用redis。我想知道是否有像php这样的文件系统存储。我只想用它在开发机器上存储会话。我搜索了谷歌,但没有找到任何具体的东西。这不应该太复杂,我确定我遗漏了一些明显的东西

【问题讨论】:

  • 为什么不能使用redis?它是满足您要求的正确解决方案。话虽如此,您是否真的在寻找一种在本地打开文件、写入文件然后在您的 Rails 应用程序中读取的方法?
  • 不,我正在寻找一个使用 php 之类的文件的会话存储。我不想在我的开发机器上安装redis,仅此而已。此外,由于我使用 2 台笔记本电脑并经常在 windows 和 linux 之间切换,我真的不想在所有笔记本电脑上设置 redis。文件系统适合我的开发需求。我将使用 redis 存储进行生产(或测试)
  • @SomeshMukherjee 我不知道在Windows上有多复杂,但是在Linux上设置redis不超过sudo apt-get install redis(或sudo yum install redis)。您只需执行redis-server 即可运行它(如果您不想这样做,则无需配置)。

标签: ruby-on-rails session devise


【解决方案1】:

由于 Rails 具有管理会话的解耦方式,您可以实现自定义会话存储,使用文件来存储其数据。 但是,请记住,这必须严格用于开发,文件 I/O 速度远不及 RAM,并且可能成为应用程序的严重瓶颈。

这里是使用文件系统的自定义会话存储的完整实现(代码不是我的,链接在最后)

class CustomFileStore < ActionDispatch::Session::AbstractStore
  def get_session(env, session_id)
    session_data = {}
    session_id ||= generate_sid
    File.open(tmp_file(session_id),'r') do |f|
      data = f.read
      session_data = ::Marshal.load(data) unless data.empty?
    end rescue nil
    [session_id, session_data]
  end

  def set_session(env, session_id, session_data, options)
    File.open(tmp_file(session_id), 'w+') do |f|
      encoded = ::Marshal.dump(session_data)
      f.write(encoded)
    end
    session_id
  end

  def destroy_session(env, session_id, options)
    File.unlink(tmp_file(session_id)) if File.exists?(tmp_file(session_id))
    generate_sid
  end

  def tmp_file(session_id)
    File.join(Rails.root, 'tmp', 'sessions', session_id)
  end
end

将其保存为“lib”文件夹中的“custom_file_store.rb”,然后使用“config/initializers/session_store.rb”中的以下代码配置您的应用以使用它 (将 RailsApp 更改为您的应用程序名称)

RailsApp::Application.config.session_store :custom_file_store

就是这样! 在此处查看此代码原作者的文章: http://bradpauly.com/blog/2013-02-01-rails-3-custom-session-store.html

【讨论】:

    猜你喜欢
    • 2019-12-13
    • 2023-04-04
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 2019-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多