Ошибка компиляции 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
Мои вопросы:
Кто-нибудь видел это раньше? Кажется странным, что модуль автовивификации не скомпилируется из-за прагмы "строгое использование".
Кто-нибудь может объяснить прерывистый характер ошибки компиляции? Еще более странно, что 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