ADOdb for PHPを使う場合session_regenerate_idをしちゃダメ

ADOdb is a database abstraction library for PHPを使って$_SESSIONをコントロールする場合、session_regenerate_id()を使っちゃいけません

必ずライブラリに付属しているadodb_session_regenerate_id()を使いましょう

session_regenerate_id()をすると特定の時だけ、$_SESSIONが破棄されるという問題がおきました

ログを埋め込みまくって原因を追及したところ原因はココ

1プロセス中に、writeが複数呼ばれた際にsession dataに差分がなければ日付のみ更新するという内容の処理(らしい)

session_regenerate_idをした場合の動き

read(session_id_OLD) select * from session where sess_key = session_id_OLD
destroy(session_id_OLD) delete from session where sess_key = session_id_OLD
write(session_id_NEW) update session set expiry = now() where sess_key = session_id_NEW

この時、1プロセス中でsessionの中身は同じなのでwriteでは日付だけ更新する
deleteしちゃってるデータをupdateしてるしSQLのエラーが多分出ているんじゃないかな・・

と、いうわけでDB上からsessionが破棄されてしまいます、ただし$_SESSIONにはこの時点では残っているのでsessionは切れません。。
F5を押すなり、違うページを開くなりすると読み込むべきデータが消えちゃってるのでここで$_SESSIONは空になります

対処法1

adodb_session_regenerate_idを使いましょう
ちゃんと新しいsession_idでupdateをしているので大丈夫

対処法2

もうあちこちにsession_regenerate_id書かれちゃってて上に置き換えるのは大変…
なので丸ごとコメントアウト ○| ̄|_

多少処理は増えるけど、それほどの負荷軽減でもないので…

というわけで3日間はまった結果はこんなんでした
多分、仕様だろうからコミットも出来ないしご注意くださいませ!としかいいようがないですね

スポンサーリンク

シェアする

フォローする

コメントを残す

トップへ戻る