Perl 为什么我的CGI::Session总是随机清空自己?

Perl 为什么我的CGI::Session总是随机清空自己?,perl,cgi,session,Perl,Cgi,Session,会话在大多数情况下都可以正常加载,但有时会随机清除所有数据,我不知道为什么: 创建我的新会话: $session = CGI::Session->new( "driver:file",undef,{Directory => '/tmp'} ); $session->param('logged_in', 1); $session->expire('logged_in', '+10m'); $session->expire('+1h'); 现在,当我转到另一个页面

会话在大多数情况下都可以正常加载,但有时会随机清除所有数据,我不知道为什么:

创建我的新会话:

$session = CGI::Session->new( "driver:file",undef,{Directory => '/tmp'} );

$session->param('logged_in', 1);
$session->expire('logged_in', '+10m');

$session->expire('+1h');
现在,当我转到另一个页面并加载会话时,我会:

$session = CGI::Session->load ( "driver:file", $sid, {Directory => '/tmp'} );

return 0 if $session->is_expired;

return 0 if !$session->param('logged_in');

return $session;

我的问题是,有时在10分钟标记结束之前,“logged_in”参数是空的,而它本不应该是空的。为什么会发生这种情况?

首先,您似乎没有使用:您应该使用。第二,不要使用间接对象表示法。即,使用
CGI::Session->new

要了解发生了什么,请使用顺序id生成器进行调试,并确保正在查看您认为正在查看的会话。确保在登录时创建会话,但从那时起,您将加载会话


检查您是如何跟踪会话id的:您是使用cookie、查询字符串参数还是使用from参数?确保正确的会话id始终可用。

我通过查询字符串传递正确的SID,即使使用load,也会发生同样的情况。使用load时,我检查是否为空,是否为随机空。我的主机可以对文件在/tmp目录中存在的时间有一个限制吗?hmmm现在似乎正在工作,它从间接对象表示法转换过来了。。。不知道为什么,我会留意一点。@user105033如果不使用间接对象表示法确实解决了您的问题,那么中列出的一个问题就是负责的。可能,
new
是作为子例程而不是方法调用的。@user105033那么,您是否仍在观察
->new
->load
的问题?你的编辑使我的回答看起来毫无意义。您使用的是哪个版本的代码?