« 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が使えない状況に陥ります。
トラックバック
現在、この記事はトラックバックを受け付けておりません。
コメント
現在、この記事はコメントを受け付けておりません。