尝试重新加载module.pm中止。编译失败

时间:2018-09-10 10:09:40

标签: perl mod-perl

我有一个用mod_perl执行并用作HTTP server的Perl脚本。 myServer.pl使用module.pm。当我与一个用户一起使用时,一切看起来都很好。但是当我承受数百名用户的压力时,却给了我这个奇怪的错误。

  

[错误]尝试重新加载MyModule.pm失败。\ n编译   在/var/www/mod_perl/myServer.pl第36行的require失败。\ nBEGIN   失败-在/var/www/mod_perl/myServer.pl行中中止编译   36。

这是我的 myServer.pl 代码的开头的示例

#!/usr/bin/perl -w
use strict;
use CGI;
#other use
use lib "/var/www/lib/receipt/pos";
use lib "/var/www/lib/common";
use MyModule;

my $q   = new CGI;
my $myM = new MyModule(requestParams=>$q);
if($myM){
  my $requestId = $myM->requestId;
  #do sth
}else{
    #do sth
}

#other codes

编辑

这是 MyModule.pm

的代码

这还不是全部,因为我不能全部张贴。所以我已经编辑了:

package MyModule;
use strict;
use CGI;
use DBI;
use lib "/var/www/lib/common";
use lib "/var/www/lib/receipt/pos";
use PDBC;
use Request;
use Response;

use Log::Log4perl qw(get_logger);
my $Log4PerlConf_myLoggerP = q(
        log4perl.category.myLoggerP    = WARN, myLoggerPLogfile
        log4perl.appender.myLoggerPLogfile           = Log::Log4perl::Appender::File
        log4perl.appender.myLoggerPLogfile.filename  = /var/www/logs/myLoggerP.Log
        log4perl.appender.myLoggerPLogfile.layout = \
            Log::Log4perl::Layout::PatternLayout
        log4perl.appender.myLoggerPLogfile.layout.ConversionPattern = (%d) %L> %m %n
);
Log::Log4perl->init_once(\$Log4PerlConf_myLoggerP);
my $loggermyLoggerP = get_logger("myLoggerP");

use constant TRUE  => 1;
use constant FALSE => 0;

use constant D_VERSION  => "6.00";

my $myCode;
my $myMsg;

my $_init;


##-----------------------getter setters-----------------------------##
sub requestId       {$_[0]->{requestId}=$_[1]       if defined $_[1]; $_[0]->{requestId}}
sub requestParams   {$_[0]->{requestParams}=$_[1]   if defined $_[1]; $_[0]->{requestParams}}
sub reqID           {$_[0]->{reqID}=$_[1]           if defined $_[1]; $_[0]->{reqID}}
##--------------------end getter setters-----------------------------##

sub code {
    my ($self,$code) = @_;
    if (ref $self) { $self->{code}=$code if defined $code; return $self->{code} }
    else { $myCode=$code if defined $code; return $myCode; }
}

sub msg {
    my ($self,$msg) = @_;
    if (ref $self) { $self->{msg}=$msg if defined $msg; return $self->{msg} } 
    else {$myMsg=$msg if defined $msg; return $myMsg; }
}

sub new {
    my $class=shift;
    my $self={@_};
    bless $self,$class;
    if ($self->$_init) {
        return $self;
    } else {
        $myCode      = $self->code;
        $myMsg       = $self->msg;
    return FALSE;
    }
}

sub addToDB{
    my $self = shift;
    my $q    = shift;
    my $type = shift;

    my $database = new PDBC(name=>"schemaName");
    if($database){
        my $response = new Response(responseParams=>$q,database=>$database,type=>$type);
        if($response){
            $self->code(0);
            $self->msg("");
            return (0,"","");
        }else{
            $self->code(Response::code);
            $self->msg(Response::msg);
        }
    }else{
        $self->code(PDBC::code);
        $self->msg(PDBC::msg);
        $loggermyLoggerP->error("database connection error - code=".$self->code.",msg=".$self->msg);
    }
}

sub recoverLost{
    my $self = shift;
    my $line = "";

    for(my $i=0;$i<10;$i++){
        my $recordName = "record".$i;
        my $temp = $self->requestParams->param($recordName);
        if(defined($temp)){
            addToDB($temp,"recover");
        }else{
            last;
        }
    }
}

$_init = sub {
    my $self        = shift;
    my $code        = 0;
    my $msg         = "";
    my $farsiMsg    = "no error";    
    my $response;
    my $requestId   = "";
    $self->reqID(1);

    my $functionName   = $self->requestParams->param('functionName');

    if(defined $functionName){
        if($functionName eq "addToDB"){
            $self->addToDB($self->requestParams,"indirect");
        }
        elsif($functionName eq "recoverLost"){
            $self->recoverLost();
        }else{
            $self->code(1019);
            $self->msg("method undefined");
        }
    }else{
        $self->code(1019);
        $self->msg("method undefined");
    }

    if($self->code==0){     
        return TRUE;
    }else{
        return FALSE;
    }   

};

1;

这可能有语法错误,但是在我的真实代码中却没有(这是我编辑名称和其他一些代码的示例代码)。它起作用,除非数百个用户同时发送请求而崩溃。

2 个答案:

答案 0 :(得分:1)

我的问题已经解决。 Log::Log4perl模块导致了此错误。它已在MyModule.pm中使用。我之前(在其他项目中)使用它都没有问题。但这一次似乎无法在指定的目录中创建日志文件,尽管在与/var/log/httpd/error_log相关的Log::Log4perl它没有给我任何错误!太烦人了。 我尝试了一切。当我从项目中删除Log::Log4perl时,即使在成千上万用户的压力下,它也能正常工作。

对于那些有相同问题的人:,您必须查看代码,看看代码中是否还有其他未正常使用的模块(可能是模块内部的模块)

答案 1 :(得分:1)

在“试图重新加载Scalar / Util.pm中止”的错误情况下,最终找到原因是由于缺少某些dll。当DBI.pm调用“使用Scalar :: Util();”时及其依赖关系,它实际上将需要加载“ \ perl \ site \ lib \ auto \ List \ Util \ Util.xs.dll”。甚至进程监视器也将错过这种依赖性:它表明Perl希望加载“ \ perl \ site \ lib \ auto \ List \ Util \ Util.ds”。因此,这里的重新加载错误消息完全令人误解,以及%INC的相应信息或有关使用require或eval的建议。