CodeIgniterの学習 35 - DB2_Sessionの微改造をおこなってセッションIDの強制切り替え時間を5秒毎(任意の秒毎)にする

(08/11/10追記)
http://d.hatena.ne.jp/dix3/20081110/1226243974 にまとめました。


(08/11/09追記)
うーん、この改造は一時取りやめ、
取りあえず元に戻して保留する。




以前のエントリhttp://d.hatena.ne.jp/dix3/20080921/1221946495 で CodeIgniter Version 1.6.3上で
DB2_Sessionを利用して、セッションデータをDBに保持するようにする暫定版対応を施した。

現在の最新版、CodeIgniter Version 1.7.0上では、
CodeIgniter標準のSession.phpが改善されて、
ライブラリの拡張をしなくても同じようなことが出来るようになっているらしいが、
まだ俺の環境はバージョンアップをしていない。いずれ移行する予定だけど。


レスポンスヘッダのSet-Cookieがすごいことに

んで、DB2_Sessionを使っていて気になっていたんだが、

アクセスのある度(というかセッションデータが読み込まれる度)
に、セッションIDが切り替わりまくってしまう。
(DB側でupdateが複数回走り、それに伴いSet-Cookieが複数走っている。)

HTTPヘッダを見るとこんな感じになってやりすぎ感がある。だめじゃん。

http://xxxx/yyyy

GET /yyyy HTTP/1.1
Host: xxxx
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; ja; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ja,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://xxxx/yyyy
Cookie: ci_session=c4cb3384eb09528c25074583be67e18e

HTTP/1.x 200 OK
Date: Thu, 06 Nov 2008 07:14:44 GMT
Server: Apache
Set-Cookie: ci_session=61312dead44a234cd3d333eab642eefb; expires=Thu, 06-Nov-2008 09:14:44 GMT; path=/
Set-Cookie: ci_session=b2d8cc655192f76ecdb37b835c48dfc8; expires=Thu, 06-Nov-2008 09:14:44 GMT; path=/
Set-Cookie: ci_session=d8d3436dd5b48aa6f770b455fecf8b45; expires=Thu, 06-Nov-2008 09:14:44 GMT; path=/
Set-Cookie: ci_session=740a60f00c34e637da1f09a55b87dd33; expires=Thu, 06-Nov-2008 09:14:44 GMT; path=/
Set-Cookie: ci_session=23b00b24d5eb50e7a79d5aa542c3ec5c; expires=Thu, 06-Nov-2008 09:14:44 GMT; path=/
Set-Cookie: ci_session=f553bcbda48c21190445e5e96bc4a727; expires=Thu, 06-Nov-2008 09:14:44 GMT; path=/
Set-Cookie: ci_session=a6c9f9b1e31aa191dbc32af28123c30f; expires=Thu, 06-Nov-2008 09:14:44 GMT; path=/
Set-Cookie: ci_session=8fe2b75c4532c97f62dd447dc0f74860; expires=Thu, 06-Nov-2008 09:14:44 GMT; path=/
Set-Cookie: ci_session=16953ae95c6783c3816379f74bbd0578; expires=Thu, 06-Nov-2008 09:14:44 GMT; path=/
Keep-Alive: timeout=15, max=99
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8
Content-Language: ja
----------------------------------------------------------

(ホスト名とかはマスクしている)


仕方がないので、DB2_Sessionを改良する

CodeIgniter Version 1.7.0で更新された system/libraries/Session.php を見てみると、

<?php
 //上略
  function sess_update()
  {
    // We only update the session every five minutes by default
    if (($this->userdata['last_activity'] + $this->sess_time_to_update) >= $this->now)
    {
      return;
    }
    //中略
  }
 //下略
 ?>

の様になっていて、セッションIDの強制切り替えは、
application/config/config.php

$config['sess_time_to_update'] = 300;

を見てくれるようになったみたいだ。

同様の対応を、DB2_Session改の、application/libraries/Db_session.php に対してもおこなうことにした。


application/libraries/Db_session.phpの改良

application/libraries/Db_session.php

<?php
 //上略
  function sess_update()
  {
    // We only update the session every five minutes by default
    if (($this->userdata['last_activity'] + $this->time_to_update) >= $this->now)
    {
      return;
    }
    //中略
  }
 //下略
 ?>

を差し込んだ。変数名が微妙に異なるのは、ソースが違うから。
見ているモノは同じで、$config['sess_time_to_update']を見ている。

あと、
application/config/config.phpで、

$config['sess_time_to_update'] = 5;

にしてみた。(60秒とかでもいいと思うけど。)


動作確認

まずアクセスしてみる。

http://xxxx/yyyy

GET /yyyy HTTP/1.1
Host: xxxx
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; ja; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ja,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://xxxx/yyyy
Cookie: ci_session=bc7c424f0eef21ae32c0a9422532851c
If-Modified-Since: Thu, 06 Nov 2008 08:00:17 GMT

HTTP/1.x 200 OK
Date: Thu, 06 Nov 2008 08:00:27 GMT
Server: Apache
Set-Cookie: ci_session=cc75ce21fb590e841cd801386aa7b94c; expires=Thu, 06-Nov-2008 10:00:27 GMT; path=/
Expires: Thu, 01 Dec 1994 23:59:59 GMT
Last-Modified: Thu, 06 Nov 2008 08:00:27 GMT
Cache-Control: post-check=0, pre-check=0
Pragma: no-cache
Keep-Alive: timeout=15, max=97
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8
Content-Language: ja
----------------------------------------------------------

うむ、あほみたくSet-Cookieされなくなった。(DB側のセッションIDの強制更新も当然起きない。)


数秒後に接続してみる。

http://xxxx/yyyy

GET /yyyy HTTP/1.1
Host: xxxx
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; ja; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ja,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://xxxx/yyyy
Cookie: ci_session=cc75ce21fb590e841cd801386aa7b94c
If-Modified-Since: Thu, 06 Nov 2008 08:00:27 GMT

HTTP/1.x 200 OK
Date: Thu, 06 Nov 2008 08:00:45 GMT
Server: Apache
Set-Cookie: ci_session=90f04f1f989ddb0f668254339430278b; expires=Thu, 06-Nov-2008 10:00:45 GMT; path=/
Expires: Thu, 01 Dec 1994 23:59:59 GMT
Last-Modified: Thu, 06 Nov 2008 08:00:45 GMT
Cache-Control: post-check=0, pre-check=0
Pragma: no-cache
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8
Content-Language: ja
----------------------------------------------------------

うむ、ちゃんと変わってくれた。



なんか、

Expires: Thu, 01 Dec 1994 23:59:59 GMT
Last-Modified: Thu, 06 Nov 2008 08:00:27 GMT
Cache-Control: post-check=0, pre-check=0
Pragma: no-cache

みたいなのが増えているんですけど、これなんすか?の理由は、

この作業中にHTTPレスポンスヘッダの調整を取りあえずしてみたから。

詳しくは明日のエントリで。つづく