2011-12-05

5.4のSession周りの変更について

みなさんごぶさたしてます。ちょびえです。



PHP Advent calendar 2011の5日目の記事です。4日目は@rsky大先生のPHP5.4の配列Tipsでした。
今日は5.4になってからのセッション周りの変更について今日は書いておこうかと思います。

[PHP5.4になって廃止された実行時設定]
session.bug_compat_42
session.bug_compat_warn

なつかしのbug_compat_42やbug_compat_warnの設定がとうとう廃止となりました。
PHPが5になるちょっと前くらいにつかっていた方(σ(゜∀゜とか)には馴染みのあった設定かと思います。

[PHP5.4になって廃止された関数]
session_is_registered()
session_register()
session_unregister()

[PHP5.4になって追加された関数]
int session_status()
現在のセッションの状態を定数値で返してくれます。定数は下記のとおり

PHP_SESSION_DISABLED
PHP_SESSION_NONE
PHP_SESSION_ACTIVE

https://github.com/php/php-src/commit/2317b4807ee7c48d1317757e496f4ee15d2d10cd#ext/session/session.c

[追加された機能]
Object指向的なSessionHandlerクラスが追加され、セッションハンドラの拡張が容易になりました。

https://wiki.php.net/rfc/session-oo
https://github.com/php/php-src/commit/b59fd01c6a3503d27c565b194c4c1e3958f8693f#ext/session/session.c

クラスの雰囲気的には前から使っている関数ベースのセッションハンドラがひとまとめになっただけですね。
ざっと概要を簡単に書いてみると下のようなクラスになります。

class SessionHandler
{
  public function open(string save_path, string session_name){}
  public function close(){}
  public function read(string key){}
  public function write(key, string data){}
  public function destroy(string id){}
  public function gc(int maxlifetime){}
}

メソッドの定義はsession_set_save_handlerで登録していたものと同じで馴染み深いものです。
クラス化することができるようになったので既存のセッションハンドラの拡張が非常に簡単になりましたね。
現在はまだ対応されていませんが、MemcachedやRedisのExtension等がクラスベースのセッションハンドラ
に対応すると簡単にセッションハンドラをカスタマイズできるのでいろいろな場面でも使えそうです。

(とはいえ既にserializedなデータを処理することになるのでSessionを書きこむ直前に書きこむ変数の値チェックしてなんかやらかしたいとかいう場合はwriteメソッド内で再度unserializeしないとできないとか色々制限がありますがね(´ー`))

実際に扱うときはクラスを定義して下記のようにすればOKです。

session_set_save_handler(new MySession());

6日目は@madapajaさんです。それではよい12月を!