2014.04.21
codeigniterはセッション情報をクッキー保持するので、複数台構成でもセッション保持してくれる
サービスが拡大していくと、いずれサーバの複数台構成にしなければならなくなる状況になります。
その時にあーだ、こーだ、と設計を見直ししなればならなくなり面倒な開発を行う必要があります。特にサーバが切り替わるとログアウトしてしまいログイン状態を維持できない状況に陥ります。
codeigniterというフレームワークは、Webサーバ複数台構成を見据えて、ログアウトせずにセッション維持するための仕組みが用意されています。
まず、codeigniterはセッション管理に独自な仕組みを持っています。
codeingierのセッション管理
codeigniterでセッションに保持したい場合は、以下のようにセットを行ないます。
$this->load->library('session'); $this->session->set_userdata('company_name', 'アルベ');上記関数名から、一見、セッションに保持しているんだーと思ってしまいますが、実は違います。 codeingierのセッションクラス(CI_Session)にset_userdata関数の処理が書かれています。
function set_userdata($newdata = array(), $newval = '') { … $this->sess_write(); }上記よりsess_write関数を呼び出しているので、その関数を同クラス内で探すと以下の処理が書かれています。
function sess_write() { … $this->_set_cookie($cookie_userdata); }上記より_set_cookie関数を呼び出しているので、その関数を同クラス内で探すと以下の処理が書かれています。
function _set_cookie($cookie_data = NULL) { … setcookie( $this->sess_cookie_name, $cookie_data, $expire, $this->cookie_path, $this->cookie_domain, $this->cookie_secure ); }上記より、setcookieというphpで用意されている関数を読んでいることが分かります。 phpの$_SESSIONでセットされておらず、codeigniterのセッション管理はクッキーに保持していることがわかります。 cookieに保持していること、つまりサーバ上のメモリ内にセッションがなく、クライアントマシン(=ブラウザのクッキー管理内)にあるので、Webサーバが切り替わってもセッションが破棄されることはありません。なので複数台構成でもセッションが維持されているのです。 ただ、デメリットとして、クッキーはデータ容量として4KB制限があるのでそれ以上を保管することはできないのですが、セッションとはそもそも必要最小限のデータを管理し、パスワードや不要なデータは入れないで実装するのが綺麗な書き方です。セッションに入れると実装が楽だからという理由でセッションを多用するのはよくありません。 なので逆に制限があったほうがセッションをむやみに利用しなくなるので逆にメリットだと思います。