odeの開発メモ日記

プログラマーやってます。今までの道のり ポケコンbasic→C(DirectX5 ネットやろうぜ)→Perl(ちょろっと)→Java→C#→Ruby→Android(Java)

セッションの格納先をmemcacheにする。

やり方

memcache-clientのgemをインストール(追記あり)

gem install memcache-client

追記(2008/11/20)

rails2.1からはmemcache-clientが同梱されていました。(rails2.0にはなかったです)
なのでgemのインストールは不要になりました。

activesupportの中にありますソース見た感じ一緒でした(ちょびっとリファクタしてるっぽかったですが)。
ruby_lib\gems\1.8\gems\activesupport-2.1.2\lib\active_support\vendor\memcache-client-1.5.0


enviroment.rb

(省略)
Rails::Initializer.run do |config|
(省略)
  config.action_controller.session = {
    :session_key => '_アプリ名_session',
    :secret      => 'セキュアな文字列(ランダムな文字列等)'
  }
  config.action_controller.session_store = :mem_cache_store
(省略)
end

memcache_options = {
  :namespace => "アプリ名-session-#{ENV['RAILS_ENV']}",
  :readonly => false
}
SESSION_CACHE = MemCache.new([ APP_CONF_SESSION_MEMCACHE_HOST ], memcache_options)
ActionController::CgiRequest::DEFAULT_SESSION_OPTIONS.merge!({ 'cache' => SESSION_CACHE, 'expires' => 30.minute })

memcache_optionsに渡せるoptionは3つらしい(ソース見た感じ)
:namespace、:readonly、:multithread
(rails1.2 までは別のライブラリRuby-MemCacheというのを使っていたので引数が少なくなってるらしい
昔は:compression、:debug、:urlencodeがあった。


CookieStoreから変更したので
application.rbのprotect_from_forgeryの:secretのコメントを外す。

class ApplicationController < ActionController::Base
  helper :all # include all helpers, all the time

  # See ActionController::RequestForgeryProtection for details
  # Uncomment the :secret if you're not using the cookie session store
  protect_from_forgery :secret => 'セキュアな文字列(ランダムな文字列等)'


以上で完了


いろいろググって調べたつもりだけど
大抵下記のオフィシャル情報をみんな見てやってるらしい。
http://wiki.rubyonrails.org/rails/pages/HowtoChangeSessionStore

けどこれだとtimeoutのexpiresが指定されていなく、デフォルトの0秒が使われてしまう。
なんか1日たってもログアウトしないなーと思ってたら永遠の設定らしい。。(よくあるデフォルト値が30分とかではなかった。。)
ググってもわからなかったのでソースを見たら
DEFAULT_SESSION_OPTIONSにexpiresという引数があったので、それを指定したらうまくいった!

expiresのために参照したソース
\ruby_lib\gems\1.8\gems\actionpack-2.1.2\lib\action_controller\session\mem_cache_store.rb


実行環境

rails(2.1.2)
memcache-client(1.5.0)


追記(2008/11/20)

cache_fuというmemcacheのライブラリでsessionをmemcacheにする設定がありました。こっちのほうがいいかな。
設定方法