SHIRANGANA Laravelでexpire_on_closeをtrueにしているのに放置しているとセッションが切れる 忍者ブログ
エンジニア日記
Admin / Write
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

CSRF TOKENと関わりの深い話題だと思うので[こちら]もどうぞ。

「せや!セッション持続時間を永続化したろ!」
「expire_on_close = true!これで放置しても大丈夫やで!」
 
〜約2時間後〜
 
SE「消えたンゴ」
PG「ワイは消えてない・・・なぜなのか」
 
という状況の解決策をシェアしたいと思います。
 

解決策:

lifetimeを長めに取ってみて下さい。
gc(ガベージコレクション)がセッションデータを削除しているかもしれません。

expire_on_closeがtrueならlifetimeは無視されると思いきや・・・ 

実はガベージコレクションの判定では使用されています。

LaravelもネイティブPHPも、セッションデータを失う条件は
 
1.cookieが削除された
2.セッション自体の有効期限が切れた
3.gcが発動した
 
の3通りが主で、Laravelの場合1と2はexpire_on_closeで対応できますが
3はlifetime + lotteryの設定で動作するようになっています。
 
要するに、expire_on_closeがtrueでセッション自体の有効期限を永続化しても
ガベージコレクションが起こればデータが削除される場合があるということです。
 
例えば、lifetimeが120、lotteryが[2, 100]であるならば
そのサーバに誰かからアクセスされる度、
2/100(=2%)の確率で2時間以上更新されていないセッションデータを削除するという動きをします。
(消えたり消えなかったりのムラはこの確率判定が原因です)
 
極端な話、lifetime = 1 / lottery = [100, 100]にすると、
expire_on_close = trueでも
1分以内にアクセスしなければセッションが吹っ飛ぶ様を見ることができます。
 
放置されがちなアプリなら2時間は短いと思うので、例えば
「1週間触られていないセッションデータはさすがにゴミデータですよね」というポリシーなら
lifetimeは 60分 x 24時間 x 7日 = 10080
等と設定すれば良いと思います。
 
gcを緩めすぎてデータ量が肥大化しないよう、
アプリの用途と規模を考慮し、用法用量を考えて正しくご設定くださいませ。
 
 
PR
この記事にコメントする
Name :
Title :
Mail :
URL :
Color :   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
Comment :
Password :
HOME | 29  28  27  25  18  16  13  10 

忍者ブログ [PR]