QA@IT

phpのセッションの有効期限について

4040 PV

phpでサーバ側のプログラムを作成しているのですが、数時間経つとセッションが自動的に切れてしまいます。

session.gc_probability、session.gc_divisor、session.gc_maxlifetime辺りの設定に問題があるように思われますが、下記の初期設定になっており、1/100の確率でセッションが1440秒で破棄されることだと認識しております。

session.gc_maxlifetime 1440
session.gc_probability 1
session.gc_divisor 100

1/100の確率なので、数時間経過すると毎回セッションが切れてしまうのはおかしいと思うのですが、なぜなのでしょうか。

原因と解決策について教えて頂けますと幸いです。

回答

基本的にその確率は負担のかかるガベージコレクトの頻度を緩和するためのもので、セッション破棄の遅延に関する何かを保証するものではないと思います。
ですのでその様な使い方はなさらない方が良いでしょう。

さて、どのような環境下で試されたかわかりませんが、その設定以外で確認すべき点としては、

  • クッキーの有効期限
  • 他のアプリケーションが同じsession_pathを使用していないか

があるとおもいます。
クッキーの削除によってクライアントの方からセッションを破棄していたり、ほかのアプリケーションのGCに巻き込まれていないかですね。

ただし、この設定を変えても24分経っていればすでにゴミデータですので再利用されない可能性は十分にあります。

編集 履歴 (0)

1/100の確率というのは、リクエストが来る度に1%の確率でガーベッジコネクションプロセスが起動するという意味です。

http://www.php.net/manual/ja/session.configuration.php#ini.session.gc-divisor

したがって、あなた以外に誰も使っていない(リクエストが来ない)のであれば、あなたの疑問もうなずけますが、通常は色々な方が使っているでしょうから、数時間も経てば大抵ガーベッジコネクションプロセスが起動され、session.gc_maxlifetimeが経過したセッションは破棄されるでしょう。

解決策は、session.gc_maxlifetime を必要に応じて大きくすることです。

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。