S2Daoでセッション管理
S2Ethna v0.2に向けて、S2Daoを使ったセッション管理機能(Ethna_SessionをファイルじゃなくてDBで管理)を作ってみた。
通常のEthna_Sessionはファイルをセッション情報の格納先にしているけれど、ちょっと規模の大きいサイトを構築すると、負荷分散でウェブサーバを増やしたときにセッション情報を共有できずに困ってしまう。まぁ、その解決方法はいろいろとあるわけだけど、最も簡単なのがデータベースにセッション情報を格納することでしょう。
で、せっかくS2Daoを使えるようにしたんだから、Ethna_Sessionをデータベースに対応させてみよう。…簡単にできたんだけど、とあるところで躓いた。
セッションを張っている端末のセッション情報(データベース内)を消すと、次回アクセス時に、
Fatal error: session_start() [<a href='function.session-start'>function.session-start</a>]: Failed to initialize storage module: user (path: XXX\S2Ethna/tmp) in XXX\S2Ethna\lib\pear\Ethna\class\Ethna_Session.php on line 159
というエラーになってしまう。再読込すると、何事もなかったようにセッションを張り直している。なんだこりゃ?
かなりの時間悩んだあげく、PHPのバグという結論に。PHP Bugs: #32330がそれだ。
「session_set_save_handler()後にsession_destroy()を行うと、セッション関係の情報が初期化される(かどうか詳細は知らない)が、ハンドラの設定はそのまま、その後にsession_start()を行うと上記のエラーが出る」、という事態のようだ。設定をリセットするか、そのままのどっちかにしてくれ。しかもかなり前から放置されてるし。
ということで、session_destroy()後に再度session_set_save_handler()を行うことで問題解決。無駄に疲れた…。
とりあえず参照させてもらったところにトラックバック。