だいこんの日々2

軸足をtwitterとfacebookに移しつつも、技術的な話はここに書いていきます。

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()を行うことで問題解決。無駄に疲れた…。

とりあえず参照させてもらったところにトラックバック