我在我的主机上安装了CGI :: Session模块,在我的cgi-bin中创建了perl-modules目录,然后将模块解压缩到该目录,所以我有:
D: cgi-bin/perl-modules/CGI/
F: cgi-bin/perl-modules/CGI/Session.pm
D: cgi-bin/perl-modules/CGI/Session/
F: cgi-bin/perl-modules/CGI/Session/File.pm
D: cgi-bin/perl-modules/CGI/Session/ID/
D: cgi-bin/perl-modules/CGI/Session/Searialize/
在我做的脚本中(这位于cgi-bin / test /中):
use lib '../perl-modules';
use CGI::Session;
$session = new CGI::Session (
"driver:File",
undef,
{Directory => '/tmp'}
);
$session->param('_logged_in', 1);
$session->param('_remote_ua', $ENV{'HTTP_USER_AGENT'});
$session->expire('+2hr');
一切正常,直到过期的电话。当我将过期调用放入eval中时,我收到以下错误:
Can't locate auto/CGI/Session/File/expire.al in @INC (@INC contains: ../perl-modules /usr/lib/perl5/5.8.7/i686-linux /usr/lib/perl5/5.8.7 /usr/lib/perl5/site_perl/5.8.7/i686-linux /usr/lib/perl5/site_perl/5.8.7 /usr/lib/perl5/site_perl /usr/lib/perl5/vendor_perl/5.8.7/i686-linux /usr/lib/perl5/vendor_perl/5.8.7 /usr/lib/perl5/vendor_perl .)
有什么想法吗?
答案 0 :(得分:1)
最新的CGI::Session distribution存档没有CGI :: Session :: File - 您必须使用非常旧的版本。在新版本中,您需要在新调用中编写“driver:file”(注意'f'的情况)。
如果您需要那个过时的版本并且无法在托管上安装任何内容,请在本地安装该版本的CGI :: Session,并将“auto / CGI / Session /”目录从%Perl%/ site / lib /复制到托管太。另一个选择是在没有cpan shell的情况下执行make
并从blib / arch复制该目录。
答案 1 :(得分:1)
我认为你的问题在于相对路径。假设您的脚本是从Apache或其他Web服务器执行的,这似乎是安全的。在这种情况下,../perl-modules/
可能就在任何地方。
在我的网络服务器上,当前工作目录为/usr/local/apache22/
,因此../perl-modules/
将解析为/usr/local/apache22/../perl-modules
或/usr/local/perl-modules/
。为了克服这个问题,我建议使用绝对路径而不是相对路径。例如:
use lib '/home/user105033/perl-modules/';