当我尝试这个时:
while (my $cgi = new CGI::Fast) {
...
my $session = CGI::Session->new(undef, $cgi);
...
}
我发现不同的客户正在进行相同的会话!什么会导致这个奇怪的会话分享?
编辑:我无法可靠地重现这一点,但在我的测试中,我看到过从浏览器中删除会话cookie,刷新页面以及(使用Firebug的Net窗格)的情况我没有在请求中发送cookie但在响应中使用旧会话ID获取Set-Cookie!由于使用FastCGI,可能会在内存中出现问题?
(注意:我从这个问题的早期版本中删除了第二段代码,因为我不再确定它是否相关)
编辑:此http://osdir.com/ml/web.fastcgi.devel/2004-02/msg00007.html似乎在描述我所看到的行为
修改 如上面的osdir.com帖子所述,FCGI.pm包含以下代码:
for (keys %FCGI::ENV) {
$ENV{$_} = $FCGI::ENV{$_} unless exists $ENV{$_};
}
这看起来很明显是我眼中的缺陷。只要当前请求不为给定变量提供值,它就会从环境变量的持久副本复制到脚本可见的环境副本中。因此,如果请求没有cookie,那么它将找不到定义的HTTP_COOKIE,因此它将为脚本提供发送它们的最后一个请求的cookie,这意味着其他会话!我不知道这段代码是如何正确的,这是一个非常高度使用的模块!
答案 0 :(得分:2)
我在七个月前修复了这个bug,你需要将CGI.pm升级到> = 3.56。 CGI :: Fast使用的FCGI API在十多年前已被弃用并从文档中删除。
答案 1 :(得分:1)
你在使用mod_perl吗?如果是这样,全局变量将在请求中持续存在,这将是间歇性的,因为它将取决于请求是否由相同的apache httpd进程处理,这取决于站点负载和其他变量。