PHPでセッションファイルが削除されるタイミングはちょっと複雑で、
session.gc_maxlifetime
session.gc_probability
session.gc_divisor
のパラメータが影響する。
まずは、
session.gc_maxlifetimeについて。
この値はサーバ側で管理しているセッションの有効期間を秒単位で設定するパラメータです。
デフォルト1440秒となっている。
デフォルトではセッションの情報はサーバ内のファイルに保存されている(session.save_handler)。
session.gc_maxlifetimeはそのファイルを消去
(ガベージコレクション)するまでの時間として使われます。
と言っても、消去するタイミングは他のセッションの開始時です。
セッションファイルが使われなくなって1440秒(デフォルト)経過したときではない。
しかも、削除を実行するタイミングを決定する
session.gc_probability、session.gc_divisorなどというパラメータも絡んでくるのでさらに複雑になる。
セッションファイルが削除されるタイミングを一言で言うと以下になる。
そのセッションファイルに最終アクセスした時刻からsession.gc_maxlifetimeで設定した値が経過していて、その他のセッションが開始されたときで、かつsession.gc_probability÷session.gc_divisorの確率で削除を実行するよ。
※最終アクセス日時が使えないOSでは最終更新日時が使われるよ。
となります!←わからん…
まあ、
設定した時間がくればいずれ削除されるよ!てきな感じでいいですか???
それと、今回発見した面白い現象について!
うちのサーバでsession.gc_maxlifetimeを設定してたのですが、設定が全然有効になりません。
なぜ?
@リマインダー
ではPCサイトと携帯サイトでsession.gc_maxlifetimeに違う値を使っています(php.iniファイルを別々に設定)。
PCサイトでは長め。携帯サイトでは短めに。と設定しています。
ですが、どうもPCサイトでも携帯サイトで設定した短い値が使われているっぽいんです。
なぜだ?不思議だ?PCサイトのphp.iniはちゃんと使われているのに。。。
わからん
わからん
わからん
わからん
2年間悩みました。。。(わからないんで保留してただけですが・・)
そして、昨日!無事!解決!しました!
答えは単純でした。
2つのサイトのセッションファイルを同じディレクトリに置いていたためでした。
携帯サイト側が効いたときに、携帯サイトのsession.gc_maxlifetimeを元にディレクトリ内のセッションファイルが削除されていたため、PCサイト側のセッションファイルも削除されていたのです。。。。。。。。
単にそこにあるファイルをアクセス日時で削除してるだけですから
session.save_pathでセッションファイルを置く場所を別々に設定することで無事解決しました。
よかった よかった
余談ですが、
なんでデフォルトが1440秒なの?24分って。。おかしくね?
分と間違えたやろ?
と、この値を決めた人に聞いてみたい今日この頃。