LoginSignup
25
29

More than 5 years have passed since last update.

CodeIgniter 3系列でのセッション管理

Posted at

CodeIgniterもバージョン3となり、「いちばん変わったのはライセンス」という程度に、フレームワークの大枠にはあまり大きな変化がなかったのですが、セッションまわりのライブラリは完全に書き換えられています。

CodeIgniter 2時代は付属のセッションライブラリが機能不足で、いろいろ学んで自ら手を入れざるを得なかったのですが、新バージョンではどうなっているか見て行きましょう。

$_SESSIONの利用

まずいちばんの注目点は、$this -> session -> userdataというCodeIgniter独自の流儀ではなく、PHP標準のスーパーグローバルである$_SESSIONを使う形となっていることです。すなわち、$_SESSIONを使うような(CodeIgniterとは別系統の)ライブラリも、そのままCodeIgniterのセッションを使えるようになるということです。

いったいどういう仕組みかと思って調べてみると、実はPHP標準でsession_set_save_handlerという関数があって、これを使うことで$_SESSIONの挙動を自前の関数に置き換えられるのです。CodeIgniter 3では、この仕組みを使っています。

なお、互換性のために$this -> session -> userdata形式のアクセスも残ってはいますが、直接$_SESSIONを使う、あるいは$_SESSION['hoge']$this -> session -> hogeという形でアクセスできるようなマジックメソッドを使うこともできます1

セッションデータの削減

$_SESSIONの枠組みを使うことになったこと、また後述のようにCookieへの保管が廃止されたこともあって、セッションが持つCookieには純粋にセッションIDだけが入るようになり、またセッションデータとしてもIPアドレスやユーザーエージェントなどは入らなくなっています。こういった値が何かで必要なら、別途取得しましょう。

セッション同士のロック

CodeIgniter 2では、同じセッションから複数の接続が来ると、同時に同じセッションへアクセスできるようになっていました。このような「ノンブロッキング」なセッションでは、同時に書き換えを行うとややこしい問題を生じることになります(状況によっては、セッションが切れます)。

CodeIgniter 3ではこの点も改められ、同じセッションでは同時に1接続しか処理しないようになりました。もしセッションの書き換えが必要ない処理が続くのであれば、session_write_closeでセッションを閉じることで次のリクエストがセッションを処理できるようになります。

また、CodeIgniter 2でAjaxなどのリクエスト時にセッションが切れていた問題も、ロックと標準関数の利用で解決しているようです。

セッション本体とドライバーの分離

CodeIgniter 3では、実際にセッションを制御するSessionクラス以外に、データ保管のロジックを書いたドライバライブラリを組み合わせて使う形式となっています。標準添付されるドライバーとして、

  • ファイル(デフォルト)
  • RDB
  • memcached
  • Redis

へそれぞれ保存するようなドライバーが用意されています。もちろん、自分で別なシステム向けのドライバーを書くこともできます。

Cookie保存の廃止

CodeIgniter 2ではデフォルトで存在していた、Cookieへデータを保存するセッションですが、Cookieという性質上全データが通信に乗ってしまうので数々の問題を起こす、ということから、CodeIgniter 3では廃止されています。マニュアルでも「改めて作ろうとしないでくれ」と明記してありました。

その他

これはセッションライブラリとは別なのですが、暗号化ライブラリではMcryptもしくはOpenSSLが必須となっていて、CodeIgniter 2であったような「オレオレ暗号化」は行わないようになっています。

情報源


  1. PHPでは、何故かこの機能が「オーバーロード」と呼ばれています。 

25
29
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
29