[php]ログインセッションの維持・有効期間について (session,cookie)
cookieとsessionファイルと、登場人物が複数いるので、どこに何を設定すればよいか、よくこんがらがるので整理。
Contents
まず、セッションの仕組み
①session_start()で、サーバー上にセッションファイルが生成される。
デフォルトは/var/lib/php/session以下に保存。dbに保存とか保存先の変更もできる。
②session_idをクライアントのブラウザにcookieとして保存する。
session_idを保存するcookie名はphpデフォルトでは、PHPSESSID。
php.iniの設定や、session_name()で動的に変更も可能。
セッションが切れるとは
動作的には、①のセッションファイル、②のcookieいずれかが破棄されると、セッションが維持できなくなる。
ユーザーから見ると、これがセッションの有効期間ということになる。
なので、設定する側は二つの要素の有効期間に配慮しないといけない。
ここら辺でこんがらがる。
①セッションファイルの有効期限
セッションファイルが削除されるのは、
- (1)セッションの最終更新日時から”session.gc_maxlifetime”(単位秒:デフォルト24分)以上経過しており、
- (2)その後、session_start()時にガーベジコレクションが動いたタイミング。
となる。
しかし、ガーベジコレクションは必ず動くわけではなく、“session.gc_probability / session.gc_divisor”の値(デフォルト1/100)の確率で動く。
なので、極端にアクセスが少ないと、なかなかファイルが消えず、同じセッションIDが使えたりする。
なので、
sesssionファイルの有効期限は「session.gc_maxlifetime」(秒)で設定し、
確実にセッションデータを削除したい(時間経過で終わりだよとしたい)なら、「 session.gc_divisor」の値を小さくするとよい。※後述のcookieの削除の方が挙動としては確実かも..
session有効期限の設定方法
複数の方法がある。
方法1. php.iniファイルを変更する。
シンプルだが、レンタルサーバーなどで、php.iniをいじれない場合は困る。。
方法2. プログラム中で動的に設定する。
php_set_ini()を使って、毎回明示的に設定する。
ただし、session_start()の場面で、設定がもれて他の値が設定されると、小さいほうにアジャストされるので、ちょっと怖い。
方法3. .htaccessに記述する
php.iniが編集できなくても、.htaccessが使えるならこれが一番いいかも。
こんな感じ。604800は60*60*24*7 で1週間。
1 2 3 4 |
#session php_value session.gc_maxlifetime 604800 php_value session.gc_probability 1 php_value session.gc_divisor 1000 |
sessionの期間に合わせてcookieの有効期間も設定しないと。
短くするならどっちかが消えればいいけど、長くしたいなら両方長くないといけない。
cookieの有効期限のは、cookie作成時に有効期間(破棄日付)を設定するだけ。
設定する場所によってそれぞれやり方が異なるが、考え方は同じ。
PHPの場合
setcookie()の3番目の引数。
参考:http://php.net/manual/ja/function.setcookie.php
jsの場合
こんな感じ。たいていセット用の関数でcookieをセットすると思うので、その関数の仕様を確認したほうがよいかも。
1 |
document.cookie = "username=John Doe; expires=Thu, 18 Dec 2013 12:00:00 UTC"; |
参考:https://developer.mozilla.org/ja/docs/Web/API/Document/cookie
CakePHPのようなフレームワークの場合、その中でそれぞれ設定できる。
サービスがフレームワーク内で全てであれば、そこの設定でよい。
Cakeの場合はcore.phpに下記のような設定をしてこまごま記述できる。
1 2 3 4 5 6 7 8 9 10 |
Configure::write('Session', array( 'defaults' => 'php', 'cookie' => 'cookie名', 'cookieTimeout' => 60 * 24 * 30, // cookieの有効期間 (分) 'timeout' //cake上のsessionの有効期間 (分) ※注意 //ini設定 'ini' => array( 'session.gc_maxlifetime' => 60 * 60 * 24 * 30, //php上のsessionの有効期間 (秒) ※注意 ), )); |
注意が必要なのは、
‘timeout’はcake内でのsession有効期間の話で、上述したphp.iniのgc_maxlifetimeとは別。
なので、gc_maxlifetimeも設定する。単位が違うことも注意が必要。
参考:https://inoccu.com/blog/2012/11/21/223145.html
関連記事
-
-
[php]mail()の送信元、エラー送信先設定(from, return-path)
ちょっと整理。 設定例 [crayon-607d5797d9cd35335503 …
-
-
[ruby][php]Excel出力操作の方法
Excel出力が要件としてもとめられた、言語は問わない、WEBではなくバッチで。 …
-
-
[PHP][PDO]prepareでのバインド方法整理
データをstmtに渡す部分をちょくちょく待ちがえて混乱するのでメモ 参考:htt …
-
-
CakePHPでjoinしようとしたときのエラー 【Notice (8): Undefined offset: 0 [CORE/Cake/Model/Datasource/DboSource.php, line 1714]】
Cakeでfind()からjoinしようとしたときに下記Noticeが出て、検索 …
-
-
【サクッと始める】PHPでGoogle Analytics API(WEBアプリケーション)
注意 ①本記事で使っているGoogleAPI用PHPライブラリ「google-a …