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