Ошибка компиляции Perl CGI в autovivication.pm

Я использую скрипт perl cgi, который использует наши собственные библиотеки, которые используют прагму "no autovivification". Например

/usr/lib/company/mysim.cgi:

#!/usr/bin/perl -w

use strict;
# ... other use
use Company::Module1;

/usr/lib/perl5/Company/Module1.pm

package Company::Module1;

no autovivification;
use strict;
use warnings;

Примерно в 50% случаев при обращении к URL-адресу для доступа к сценарию cgi компиляция завершается неудачно...

[Fri Dec 04 15:40:10.744901 2015] [:error] [pid 30455:tid 2961136448] Bareword "A_HINT_STRICT" not allowed while "strict subs" in use at /usr/lib/i386-linux-gnu/perl5/5.20/autovivification.pm line 144.\nBareword "A_HINT_WARN" not allowed while "strict subs" in use at /usr/lib/i386-linux-gnu/perl5/5.20/autovivification.pm line 144.\nBareword "A_HINT_FETCH" not allowed while "strict subs" in use at /usr/lib/i386-linux-gnu/perl5/5.20/autovivification.pm line 144.\nBareword "A_HINT_STORE" not allowed while "strict subs" in use at /usr/lib/i386-linux-gnu/perl5/5.20/autovivification.pm line 144.\nBareword "A_HINT_EXISTS" not allowed while "strict subs" in use at /usr/lib/i386-linux-gnu/perl5/5.20/autovivification.pm line 144.\nBareword "A_HINT_DELETE" not allowed while "strict subs" in use at /usr/lib/i386-linux-gnu/perl5/5.20/autovivification.pm line 144.\nCompilation failed in require at /usr/lib/company/mysim.cgi line 14.\nBEGIN failed--compilation aborted at /usr/lib/company/mysim.cgi line 14.\n

(взято из /var/log/apache2/ssl/error.log, так как этот скрипт находится на порту https).

Моя среда: - Debian Jessie (8.2) - Tomcat7 - Apache2 (2.4) - Perl 5.20.2 - Libautovivification-Perl 0,12-1+b1

Мои вопросы:

  1. Кто-нибудь видел это раньше? Кажется странным, что модуль автовивификации не скомпилируется из-за прагмы "строгое использование".

  2. Кто-нибудь может объяснить прерывистый характер ошибки компиляции? Еще более странно, что cgi не может скомпилировать ~ половину времени и работает нормально (т.е. работает и возвращает ожидаемые результаты) в другой половине.

Спасибо за ваше время.

12.09.2015: Дополнительная информация...

Спасибо всем за отзывы.

Там нет явного создания потоков, хотя это в контексте apache, так что есть предположительно многопоточность запросов.

Похоже, коренной причиной является сбой в XSLoader. По крайней мере, этот минимальный рабочий пример...

package autovivification;

use 5.008_003;

use strict;
use warnings;

our $VERSION;
BEGIN {
 $VERSION = '0.12';
}

BEGIN {
 require XSLoader;
 XSLoader::load(__PACKAGE__, $VERSION);
}

my %bits = (
 strict => A_HINT_STRICT,
 warn   => A_HINT_WARN,
 fetch  => A_HINT_FETCH,
 store  => A_HINT_STORE,
 exists => A_HINT_EXISTS,
 delete => A_HINT_DELETE,
);

компилирует, тогда как это

package autovivification;

use 5.008_003;

use strict;
use warnings;

our $VERSION;
BEGIN {
 $VERSION = '0.12';
}

#BEGIN {
# require XSLoader;
# XSLoader::load(__PACKAGE__, $VERSION);
#}

my %bits = (
 strict => A_HINT_STRICT,
 warn   => A_HINT_WARN,
 fetch  => A_HINT_FETCH,
 store  => A_HINT_STORE,
 exists => A_HINT_EXISTS,
 delete => A_HINT_DELETE,
);

терпит неудачу с той же ошибкой.

Итак, я пойду искать ошибку загрузки в логах apache.... где-нибудь.

Еще раз спасибо за ваше время.

16/12/2015: обновление - исправлено

Основной причиной был mod_perl в сочетании с (возможным) изменением между apache 2.2 и 2.4. Конфигурация apache для скрипта, которая присваивает ему URI-код ScriptAlias ​​в / cgi-bin/script, выполняется перед настройкой URI /cgi-bin для обработки mod_perl. В apache 2.2 это упорядочивание кажется важным, и скрипт не был обработан mod_perl. Однако в Apache 2.4 упорядочение не кажется важным, и скрипт теперь обрабатывается mod_perl.

Ошибка возникла из-за того, что этот скрипт не был (и никогда не предполагался) обрабатываться mod_perl. Исправление состояло в том, чтобы изменить URI для скрипта на /thingelse / script.

Спасибо всем за комментарии.

1 ответ

Основной причиной был mod_perl в сочетании с (возможным) изменением между apache 2.2 и 2.4. Конфигурация apache для скрипта, которая присваивает ему URI-код ScriptAlias ​​в / cgi-bin / script, выполняется перед настройкой URI /cgi-bin для обработки mod_perl. В apache 2.2 это упорядочивание кажется важным, и скрипт не был обработан mod_perl. Однако в Apache 2.4 упорядочение не кажется важным, и скрипт теперь обрабатывается mod_perl.

Ошибка возникла из-за того, что этот скрипт не был (и никогда не предполагался) обрабатываться mod_perl. Исправление состояло в том, чтобы изменить URI для скрипта на /thingelse/script. - HalfOpenedEye

Другие вопросы по тегам