-1

我通过在我的 cgi-bin 中创建 perl-modules 目录然后将模块解压缩到该目录,在我的主机上安装了 CGI::Session 模块,所以我有:

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');

一切正常,直到通话到期。当我将 expire 调用放入 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 .)

有任何想法吗?

4

2 回答 2

1

最新的CGI::Session 分发存档没有 CGI::Session::File - 您必须使用非常旧的版本。在新版本中,您需要在新调用中写入“驱动程序:文件”(注意“f”的大小写)。

如果您需要那个过时的版本并且无法在主机上安装任何东西,请在本地安装该版本的 CGI::Session,并将“auto/CGI/Session/”目录从 %Perl%/site/lib/ 复制到主机。另一种选择是不make使用 cpan shell 并从 blib/arch 复制该目录。

于 2010-02-09T18:47:15.277 回答
1

我认为你的问题在于相对路径。假设您的脚本是从 Apache 或其他 Web 服务器执行的,这似乎是安全的。在那种情况下,../perl-modules/可能几乎在任何地方。

在我的 Web 服务器上,当前工作目录是/usr/local/apache22/,因此../perl-modules/将解析为/usr/local/apache22/../perl-modules, 或/usr/local/perl-modules/. 为了克服这个问题,我建议使用绝对路径而不是相对路径。例如:

use lib '/home/user105033/perl-modules/';
于 2010-02-09T19:26:11.337 回答