Designed by fullvector / Freepik
なんとなく使ってるセッションだけど、
セッションが切れるタイミングっていつなんだろう?
セッションの仕組みについても知りたいな!
この記事では、以上のような悩みを解決する知識を解説します。
sessionについて役立つ情報を解説しているので、
再確認したい方はぜひどうぞ!
セッションとは?
簡単にセッションについて説明。
まず、HTTPの通信はステートレスです。
ステート(状態)レス(ない)
同じ端末で同じページにアクセスしたとしても、
ステート(状態)が残らないので、
サーバーは別のアクセスと判定してしまいます。
こんな問題を解決する手段がsessionです。
cookieを使うのはなぜ?
同じアクセスだと判定するには、
ブラウザに同じアクセスだと分かるような物を保存して、
毎アクセスごとに送信してあげる方法が考えられます。
そのためにブラウザで使えるのがcookieなのです。
ブラウザのcookieにsessionIDと呼ばれるユニークなIDを保存しておき、
サーバー側ではセッションファイルというものに実際のデータを保存します。
フレームワーク等で違いはあるが、
sessionIDをファイル名に含んだセッションファイルで、
セッションの判定を行い、実現させています。
sessionが切れるタイミング
ここからやっと本題です。
いままでの説明から、
セッションを実現するためには、
- sessionIDを保存したcookie
- サーバーに保存されたセッションファイル
この二つが必要になることが分かりました。
よってセッションが切れるタイミングは二つ
- cookieの有効期限が切れる
- セッションファイルが削除される
この2パターンが考えられます。
cookieの有効期限
cookieはどこで確認できるかというと、
Chromeの場合、
開発者ツール(Windowsの場合はF12 or 右クリックで検証、Macの場合はCommand+Option+Iキー)
↓
Applicationタブ
↓
StorageのCookiesから表示中のURLを選択
そうすると右側にCookieの一覧が表示されると思います。
デフォルトのPHP設定だとPHPSESSIDですが、
こちらはフレームワーク等で異なるため確認してください。
Expires/Max-Ageの列で有効期限を確認できます。
セッションファイルの有効期限
phpinfoで確認できますが、
session.gc_probability | “1” |
session.gc_divisor | “100” |
session.gc_maxlifetime | “1440” |
session.gc_maxlifetimeでセッションの期限を設定しています。
秒数なので1440秒で24分がデフォルトになります。
しかし、maxlifetimeを超えたから絶対に削除されるというわけではありません。
ガベージコレクションというセッションを削除する仕組みを使うことになります。
session.gc_probability / session.gc_divisor (例:1/100)の確率で、
session.gc_maxlifetimeを過ぎたセッションファイルを削除する処理が動く。
処理が起動するタイミングはsession_start()です。
いろんなユーザーがsession_start()したタイミングで、
誰かが1/100でgcが起きるので、
セッションファイルが膨大な場合に
処理が重くなってしまうユーザーが存在してしまう可能性があります。
追加で、
注意: 異なる値を
https://www.php.net/manual/ja/session.configuration.php#ini.session.gc-maxlifetimesession.gc_maxlifetime
に指定している 別々のスクリプトがセッションデータの保存場所を共有している場合、 一番小さい設定値に達した時点でデータが消去されます。このような場合には、 お互いに session.save_path を使用します。
こちらに記述があるように、
同じセッションパスを使用しているシステムが存在する場合、
小さい設定値の方が採用されてしまうため注意してください。