« NTFS で noatime / windows vista以前のマシン | メイン | PHP / ファイルの最後からn行を取得する »

2009年12月31日

CGI::Session での IPMatch の処理 >>Perl 

CGI::Session->find( sub {} );
で、ExpiredになったSession が削除されるということになっているが
IPMatchにした場合、対象外のSessionデータも無効化される(挙動を見ている限り、そのようです。)

ということで、Purgeするのにコードを書かないといけません。



# 生存期間の過ぎたセッションをすべて削除する
# Find + IP Match で 消される

my ($sess_expire_calc,$FILE,$sess,$sess_file);
if ($config{SESSION_EXPIRE} =~ m/^\+(.*?)m$/)
{
$sess_expire_calc = $1 * 60;
}
elsif ($config{SESSION_EXPIRE} =~ m/^\+(.*?)h$/)
{
$sess_expire_calc = $1 * 60 * 60;
}
elsif ($config{SESSION_EXPIRE} =~ m/^\+(.*?)d$/)
{
$sess_expire_calc = $1 * 60 * 60 * 24;
}

opendir(DIR,$config{SESSION_DIR});
while($FILE = readdir DIR)
{
if ($FILE eq "." || $FILE eq ".." || $FILE eq '.htaccess') { next; }
($sess) = (split(/\_/,$FILE))[1];
$sess_file = $config{'SESSION_DIR'} . '/cgisess_' . $sess;
if (-e $sess_file)
{
my $atime = (stat($sess_file))[8];
if ($atime + ($sess_expire_calc) <= time() )
{
unlink $sess_file;
}
}
}

サーバーの設定がnoatime だった場合はmtimeで見るべきという話もありますが。

更にIPMatch OptionがOnの場合でIP Addressが変わるとsession_id が変更になりますが、session ファイルが生成されるのは new をした時になります。

session_id が cookieと異なる場合は再生成しなければいけません。
再生成しないとSessionファイルが作成されないためにずっとSesssionが使えない状況に陥ります。

twitterこの記事をTwitterでみんなに教える。

投稿者 debizoh : 2009年12月31日 23:16



トラックバック

現在、この記事はトラックバックを受け付けておりません。


コメント

現在、この記事はコメントを受け付けておりません。