Попытка перезагрузить module.pm прервана. Сбой компиляции

У меня есть Perl-скрипт, который выполняется с mod_perl и работает как HTTP server. myServer.pl использует module.pm. Все выглядит нормально, когда я использую его с одним пользователем. но когда я подвергаю его давлению сотен пользователей, он выдает мне эту странную ошибку.

[ошибка] Попытка перезагрузить MyModule.pm прервана.\nСбой компиляции в запросе на /var/www/mod_perl/myServer.pl, строка 36.\nОшибка BEGIN -- компиляция прервана на /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;

Это может иметь синтаксические ошибки, но их нет в моем реальном коде (это пример кода, в котором я редактировал имена и некоторые другие коды). Он работает, за исключением случаев, когда сотни пользователей отправляют запрос одновременно, и он падает.


person Sarah Aziziyan    schedule 10.09.2018    source источник
comment
@SteffenUllrich В нем нет синтаксической ошибки, иначе я бы не смог его запустить. Пожалуйста, прочитайте вопрос.   -  person Sarah Aziziyan    schedule 10.09.2018
comment
@SteffenUllrich, кстати, это myModule; я только что написал образец для своего кода, поэтому здесь я сделал ошибку. В моем коде все ок. Я отредактировал вопрос.   -  person Sarah Aziziyan    schedule 10.09.2018
comment
Соглашение об именах модулей в Perl состоит в том, чтобы использовать верблюжий регистр с первой буквой в верхнем регистре, поэтому было бы лучше назвать это MyModule. Я просмотрел код Perl, который у вас есть в вашей учетной записи github. Если вам нужны отзывы, опубликуйте их на Code Review. :)   -  person simbabque    schedule 10.09.2018
comment
@SarahAziziyan: непонятно, что делает твой myModule. Но, возможно, он не возвращает true в определенных ситуациях, хотя должен делать это при использовании в use ....   -  person Steffen Ullrich    schedule 10.09.2018
comment
@simbabque да, конечно, но этот код является образцом. Я использовал верхний регистр для своих модулей в своем реальном коде.   -  person Sarah Aziziyan    schedule 10.09.2018
comment
@SteffenUllrich, что ты имеешь в виду? Я отредактирую вопрос и поставлю код MyModule.pm.   -  person Sarah Aziziyan    schedule 10.09.2018
comment
Очень важным навыком, которому нужно научиться в ИТ, является умение всегда говорить то, что вы имеете в виду. Не придумывайте примеры, похожие на вашу проблему. Придумайте примеры, похожие на вашу проблему. Если вы изменяете код, чтобы сделать его универсальным, убедитесь, что вы используете те же соглашения и тот же уровень качества, что и всегда. Очень важно быть точным, иначе нам будет очень трудно помочь, потому что мы не понимаем вас должным образом.   -  person simbabque    schedule 10.09.2018
comment
@SarahAziziyan: См. также Как создать минимальный, полный и проверяемый пример. Не поможет, если вы покажете код, который не вызывает проблему. Если вы попытаетесь показать только то, что, по вашему мнению, является важной частью кода в упрощенном виде, вы можете фактически пропустить реальную причину.   -  person Steffen Ullrich    schedule 10.09.2018
comment
@simbabque спасибо за совет. Я отредактировал вопрос.   -  person Sarah Aziziyan    schedule 10.09.2018
comment
@SteffenUllrich Я разместил свой код и отредактировал вопрос.   -  person Sarah Aziziyan    schedule 10.09.2018
comment
@SarahAziziyan: И в файле журнала веб-серверов нет других сообщений, кроме тех, которые вы включили в вопрос? Кроме того, что на самом деле делают модули PDBC, Request и Response, то есть сбои в этих модулях также могут вызвать проблему. И не могли бы вы максимально упростить свой код (хотя он все еще должен вызывать проблему) - я уже указал Как создать Минимальный, полный и проверяемый пример.   -  person Steffen Ullrich    schedule 10.09.2018
comment
@SarahAziziyan: Это не все, потому что я не могу опубликовать все это. так что я отредактировал его: - и как вы узнали, что проблема все еще существует с этой отредактированной версией?   -  person Steffen Ullrich    schedule 10.09.2018
comment
@SteffenUllrich уверен, что упрощу это. (PDBC, Request и Response — это другие модули, которые мы написали и используем здесь и в других кодах)   -  person Sarah Aziziyan    schedule 10.09.2018
comment
@SteffenUllrich, вы говорите, упростите это, а затем говорите, что я должен опубликовать все это. Что я должен делать? :)))   -  person Sarah Aziziyan    schedule 10.09.2018


Ответы (2)


Моя проблема решена. Модуль Log::Log4perl вызывал эту ошибку. Он использовался в MyModule.pm. Я использовал его раньше (в других проектах) без проблем. но на этот раз мне показалось, что он не смог создать файл журнала в указанном каталоге, хотя не выдал мне никаких ошибок в /var/log/httpd/error_log, связанных с Log::Log4perl! оооочень раздражает. Я пробовал все. и когда я удалил Log::Log4perl из своего проекта, он работал без проблем даже под давлением тысяч пользователей.

Для тех, у кого такая же проблема: вы должны изучить свой код и посмотреть, используются ли в нем какие-либо другие модули (это могут быть модули внутри модулей), которые не работают должным образом.

person Sarah Aziziyan    schedule 11.09.2018
comment
Спасибо за публикацию найденного решения :) - person Will Sheppard; 14.09.2018

В случае ошибки Попытка перезагрузить 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.

person Frank    schedule 10.07.2020