尝试重新加载 module.pm aborted.Compilation 失败
Attempt to reload module.pm aborted.Compilation failed
我有一个使用 mod_perl
执行并作为 HTTP server
运行的 Perl 脚本。 myServer.pl
使用 module.pm
。当我与一个用户一起使用时,一切看起来都很好。但是当我把它放在数百个用户的压力下时,它给了我这个奇怪的错误。
[error] Attempt to reload MyModule.pm aborted.\nCompilation
failed in require at /var/www/mod_perl/myServer.pl line 36.\nBEGIN
failed--compilation aborted at /var/www/mod_perl/myServer.pl line
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
的代码
这不是全部,因为我不能 post 全部。所以我编辑了它:
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;
这可能有语法错误,但在我的真实代码中没有(这是我编辑了名称和其他一些代码的示例代码)。除非有数百个用户同时发送请求,否则它会崩溃。
我的问题已经解决了。
Log::Log4perl
模块导致了这个错误。它被用于 MyModule.pm
。我之前(在其他项目中)使用过它没有问题。但是这次它似乎无法在指定的目录中创建日志文件,尽管 它没有给我任何错误 in /var/log/httpd/error_log
related to Log::Log4perl
!太烦人了。
我尝试了一切。当我从我的项目中删除 Log::Log4perl
时,即使在成千上万用户的压力下它也能正常工作。
对于那些有同样问题的人:你必须检查你的代码,看看你的代码中是否使用了任何其他模块(这可能是模块中的模块)无法正常工作。
在“Attempt to reload Scalar/Util.pm aborted”的错误情况下,终于找到原因是缺少某些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 的建议完全是误导性的。
我有一个使用 mod_perl
执行并作为 HTTP server
运行的 Perl 脚本。 myServer.pl
使用 module.pm
。当我与一个用户一起使用时,一切看起来都很好。但是当我把它放在数百个用户的压力下时,它给了我这个奇怪的错误。
[error] Attempt to reload MyModule.pm aborted.\nCompilation failed in require at /var/www/mod_perl/myServer.pl line 36.\nBEGIN failed--compilation aborted at /var/www/mod_perl/myServer.pl line 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
的代码这不是全部,因为我不能 post 全部。所以我编辑了它:
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;
这可能有语法错误,但在我的真实代码中没有(这是我编辑了名称和其他一些代码的示例代码)。除非有数百个用户同时发送请求,否则它会崩溃。
我的问题已经解决了。
Log::Log4perl
模块导致了这个错误。它被用于 MyModule.pm
。我之前(在其他项目中)使用过它没有问题。但是这次它似乎无法在指定的目录中创建日志文件,尽管 它没有给我任何错误 in /var/log/httpd/error_log
related to Log::Log4perl
!太烦人了。
我尝试了一切。当我从我的项目中删除 Log::Log4perl
时,即使在成千上万用户的压力下它也能正常工作。
对于那些有同样问题的人:你必须检查你的代码,看看你的代码中是否使用了任何其他模块(这可能是模块中的模块)无法正常工作。
在“Attempt to reload Scalar/Util.pm aborted”的错误情况下,终于找到原因是缺少某些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 的建议完全是误导性的。