当我尝试这个时:
while (my $cgi = new CGI::Fast) {
...
my $session = CGI::Session->new(undef, $cgi);
...
}
我发现不同的客户获得相同的会话! 是什么导致了这种奇怪的会话共享?
编辑:我无法可靠地重现这一点,但在我的测试中,我见过从浏览器中删除会话cookie,刷新页面,并且(使用Firebug的网络窗格)看到我没有发送cookie 在请求中,但在响应中获取 Set-Cookie 并带有old会话 ID! 也许由于使用 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,这意味着其他会话! 我不明白这段代码怎么可能是正确的,这是一个使用率非常高的模块!
我大约七个月前修复了这个bug,你需要将CGI.pm升级到> = 3.56。 CGI::Fast 使用的是 FCGI API,该 API 十多年前已被弃用并从文档中删除。
你使用 mod_perl 吗? 如果是这样,全局变量将在请求之间持续存在,并且这将是间歇性的,因为它将取决于请求是否由同一个 apache httpd 进程处理,这将取决于站点负载和其他变量。
我正在解决这个问题。 带有会话插件的 CGI::Application。 每个请求都会向不同的客户端返回相同的 CGISESSID。 我正在运行最新版本的 perl 和(快速)CGI。