gpt4 book ai didi

apache - autovivication.pm 中的 Perl cgi 编译错误

转载 作者:行者123 更新时间:2023-12-02 08:54:30 26 4
gpt4 key购买 nike

我正在使用一个 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 杰西 (8.2) - 汤姆猫7 - Apache 2 (2.4) -perl 5.20.2 - libautovivification-perl 0.12-1+b1

我的问题是:

  1. 有人以前见过这个吗?由于“use strict”编译指示,自动激活模块无法编译,这似乎很奇怪。

  2. 谁能解释一下编译错误的间歇性吗?更奇怪的是,cgi 有大约一半的时间无法编译,而另一半则工作正常(即运行并返回预期结果)。

感谢您的宝贵时间。

2015 年 9 月 12 日:一些附加信息...

感谢大家的反馈。

没有显式创建线程,尽管这是在 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 日志中查找加载错误......某处。

再次感谢您的宝贵时间。

2015 年 12 月 16 日:更新 - 已修复

根本原因是 mod_perl,以及 apache 2.2 和 2.4 之间(可能的)更改。该脚本的 apache 配置为其提供了/cgi-bin/script 的 ScriptAlias URI,该配置发生在设置要由 mod_perl 处理的 URI/cgi-bin 之前。在 apache 2.2 中,这种顺序似乎很重要,并且脚本由 mod_perl 处理。然而,在 apache 2.4 中,顺序似乎并不重要,脚本现在由 mod_perl 处理。

出现错误是因为该脚本不是(也绝不是)由 mod_perl 处理的。修复方法是将脚本的 URI 更改为/somethingelse/script。

感谢大家的评论。

最佳答案

根本原因是 mod_perl,以及 apache 2.2 和 2.4 之间(可能的)更改。该脚本的 apache 配置为其提供了/cgi-bin/script 的 ScriptAlias URI,该配置发生在设置要由 mod_perl 处理的 URI/cgi-bin 之前。在 apache 2.2 中,这个顺序似乎很重要,并且该脚本不是由 mod_perl 处理的。然而,在 apache 2.4 中,顺序似乎并不重要,脚本现在由 mod_perl 处理。

出现错误是因为该脚本不是(也绝不是)由 mod_perl 处理的。修复方法是将脚本的 URI 更改为/somethingelse/script。 – 半开眼

关于apache - autovivication.pm 中的 Perl cgi 编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34092559/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com