PHPでログイン時間を伸ばしたい。
そんなときはsession.gc_maxlifetimeを変更する。
これはもちろんなのだが、それでもなぜか設定時間より早くセッションが切れてしまうこと、ないですか?
それ、session.save_pathは指定されていますか?
つまり、セッションを保存する場所を指定していますか?ということ。
PHPのセッションの仕組みは、ブラウザ側のクッキーに、サーバー側のセッション情報の場所が保存されており、その情報を元にサーバーからセッション情報を拾ってくるのだ。
セッションが消えるタイミングは二種類ある。
ブラウザのセッション場所が保存されているクッキーが消えた時、
サーバーの保存場所からセッション情報が消えた時。
session.gc_maxlifetimeとは、保存場所からセッション情報を消す時間を指定するものだ。session.save_pathが指定されていない場合、デフォルトPHPの設定情報の場所へ保存される。
複数のセッション情報をサービスで利用している場合、または、バーチャルホストを利用して複数のサイト運用をしている場合などは、保存場所を指定していないと、同じセッション保存場所となってしまう。
それがなぜいけないのか?
答えとしては、指定されている時間を過ぎたらランダムで該当したセッション情報が保存場所から削除されるから。
指定されている時間を過ぎたらランダムでって、正しい動きじゃないか?
正しい、正しいけど、もしセッションの保存場所が同じで、20分でセッション破棄されるサービスと、24時間でセッションが破棄されるサービス。この二つが混在していたら?
答えは、24時間たつ前に20分でセッションが破棄されるサービスでセッションを利用した際、24時間で破棄されるものも20分で破棄される可能性があることになる。なぜなら保存場所からランダムでセッションデータを破壊するからだ。
結論
session.save_pathはサービスごとに違う場所で設定する。
コメント