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

mod_perl2: Use module by its location and not by its name

我的 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(对于 HandlerA)和 b(对于 HandlerB)。

a/MyA::foo 输出 A

b/MyB::foo 打印 B

a/MyX::foo 输出 A

b/MyX::foo 打印 B

只显示a/MyX.pm

package MyX;

sub foo
{
    return "A";
}
1;

因为 MyA 和 MyB 的名称不同,所以 HandlerA 使用正确的 foo 工作正常。

但 MyX 并非如此。

如何才能在 HandlerA 中使用 a/MyX.pm 并在 HandlerB 中使用 b/MyX.pm? 所以它应该不是按名称而是按文件位置使用模块。

Handler A 的输出应该是

Handler=A MyA=A MyX=A

HandlerB 的输出应该是

Handler=B MyB=B MyX=B

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

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

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