mod_perl2:按位置而不是名称使用模块



我的Apache网络服务器中有2个目录。

PerlModule HandlerA
PerlModule HandlerB
<Directory "/var/www/html/testa">
Options FollowSymLinks
Order deny,allow
AllowOverride All
SetHandler perl-script
PerlHandler HandlerA
</Directory>
<Directory "/var/www/html/testb">
Options FollowSymLinks
Order deny,allow
AllowOverride All
SetHandler perl-script
PerlHandler HandlerB
</Directory>

/testa 有 HandlerA,/testb 有 HandlerB。

HandlerA.pm

package HandlerA;
use strict;
use warnings;
use Apache2::Const;
use lib "/etc/apache2/a";
use MyA;
use MyX;
sub handler
{
my $r = shift;
my $str = "Handler=A  MyA=" . MyA::foo () . "  MyX=" . MyX::foo ();
$r->log_error ($str);
$r->content_type ("text/plain");
print $str;
return Apache2::Const::OK;
}
1;

HandlerB.pm

package HandlerB;
use strict;
use warnings;
use Apache2::Const;
use lib "/etc/apache2/b";
use MyB;
use MyX;
sub handler
{
my $r = shift;
my $str = "Handler=B  MyB=" . MyB::foo () . "  MyX=" . MyX::foo ();
$r->log_error ($str);
$r->content_type ("text/plain");
print $str;
return Apache2::Const::OK;
}
1;

在每个处理程序中,我都使用模块的foo。模块驻留在目录 a(对于处理程序 A(和 b(对于处理程序 B(中。

a/MyA::foo prints A

b/MyB::foo prints B

a/MyX::foo prints A

b/MyX::foo prints B

仅显示 a/MyX.pm

package MyX;
sub foo
{
return "A";
}
1;

由于MyA和MyB的名称不同,因此HandlerA使用正确的foo工作正常。

但MyX的情况并非如此。

我怎样才能在 HandlerA 中使用 a/MyX.pm,在 HandlerB 中使用 b/MyX.pm? 因此,它应该不是按名称而是按其文件位置使用该模块。

处理程序 A 的输出应为

处理程序=A MyA=A MyX=A

处理程序 B 的输出应为

处理程序=B MyB=B MyX=B

MyX 并不总是按预期工作,并且会混淆。

正如 Grinzz 指出的那样,@INC 和包命名空间是全局的 - 所以解决方案是为每个目录添加一个不同的 perl 解释器。

根据文档:https://perl.apache.org/docs/2.0/user/config/config.html#C_Parent_ 这应该至少在位置指令中起作用。

相关内容

  • 没有找到相关文章

最新更新