Advent Calendar 6日目 php Session の中身を解説
do_aki Advent Calendar 2011 : ATND の 6日目です。
php には、標準でセッションを管理する機構があります*1。
今回は(時間もネタもなくなってきたので)このセッションについて、処理系の実装を交えて解説します。
files ハンドラ
セッションは、デフォルトでは 1セッション1ファイルという形で保存されます。
これは、 ext/session/mod_file.h および mod_file.c で定義/実装されている files ハンドラが利用されています。
ext/session/session.c で、ini の session.save_handler のデフォルト値が files *2 となっているので、デフォルトで使われるというわけですね。
さらに掘り下げると、session.save_handler の値は、 php_session_start 関数 *3 で読み込まれ、その値に応じたセッションハンドラが設定されます。
セッションハンドラは、 _php_find_ps_module 関数 *4 内で ps_modules *5という変数に登録されたモジュールから探し出されます。
この ps_modules に登録するためには通常、 php_session_register_module 関数*6 を用いますが 、
files ハンドラ と後述する user ハンドラ は、ps_modules 初期化時に定義されています。*7
ちなみに、phpinfo で表示される Session セクションの Registered save handlers は、この ps_modules に登録されている一覧が出力されています。 *8
user ハンドラ
user ハンドラは少々特殊で、セッションに関する処理を php スクリプト側で実装するモノです。
利用方法等は他でもさんざん言及されていると思うので割愛。
そう言えば、 5.4では SessionHandler クラスが追加されたと id:chobi_e さんが言ってましたね。
- 5.4のSession周りの変更について
- http://chobie.hatenablog.com/entry/2011/12/05/000323
mm ハンドラ
あまり知られていませんが、php ソースコードに標準で含まれるセッションハンドラには、もう一つ、mm ハンドラというのがあります。
libmm (http://www.ossp.org/pkg/lib/mm/) を利用した共有メモリにセッションを保存する実装になっているようですが、libmm についてよく分かってないので使ったことありません。
configrue 時に --with-mm しないと利用出来ないっぽいですし。
もう一つのハンドラ
今まで紹介してきたハンドラというのは、 save handler 、つまりセッションの保存を担当する部品で、
セッション機構にはもう一つ、 serializer handlers というセッションデータのシリアライズを担当するハンドラというのもあります。
こちらも save handler と似たような管理のされ方をしているので、ソースコードを読めば直ぐに分かるかと。
まとめ
PHP セッションの内部構造を簡単に説明しました。
これでもう簡単に、新しいセッションモジュールを作成できますね ;-p
ただ、 save handler , serializer handler ともに、最大10個 *10しか登録できないので注意しましょう。
https://gist.github.com/1436414#763 とか、 https://gist.github.com/1436414#942 とか、なんで、 [MAX_MODULES + 1] で初期化してるのかよくわからんね。番兵置いてる訳じゃないのに……
理由分かる方いたら教えてください。
*1:言語組込ではなく、標準拡張モジュールに含まれます
*2:https://gist.github.com/1436414#L707
*3:https://gist.github.com/1436414#L1296
*4:https://gist.github.com/1436414#L1230
*5:ps_module[]型
*6:https://gist.github.com/1436414#L978
*7:https://gist.github.com/1436414#L973
*8:https://gist.github.com/1436414#L2210
*9:https://gist.github.com/1436414#L947
*10:php5.4.0RC2 時点 : https://gist.github.com/1436414#L970