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であったような「オレオレ暗号化」は行わないようになっています。
情報源
-
PHPでは、何故かこの機能が「オーバーロード」と呼ばれています。 ↩