我的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_ 这应该至少在位置指令中起作用。