mod_perl缓存模块是否动态加载?
我先搜索了一下,但还没有找到满意的答案(如果这是一个重复的问题,或者更糟的是,一个愚蠢的问题,我深表歉意) mod_Perl是否正确缓存了动态加载的Perl模块,如答案(下面复制的相关代码)中包含的模块,以备将来使用mod_perl缓存模块是否动态加载?,perl,apache,mod-perl,Perl,Apache,Mod Perl,我先搜索了一下,但还没有找到满意的答案(如果这是一个重复的问题,或者更糟的是,一个愚蠢的问题,我深表歉意) mod_Perl是否正确缓存了动态加载的Perl模块,如答案(下面复制的相关代码)中包含的模块,以备将来使用 my $module = 'My::Module'; eval { (my $file = $module) =~ s|::|/|g; require $file . '.pm'; $module->import(); 1; } or do
my $module = 'My::Module';
eval {
(my $file = $module) =~ s|::|/|g;
require $file . '.pm';
$module->import();
1;
} or do {
my $error = $@;
# ...
};
在上面的示例中,如果子例程在将来同样尝试使用“My::Module”(至少以mod_perl通常用于包缓存的任何方式),则在调用之后,mod_perl是否会缓存“My::Module”以备将来使用
希望这个问题有点清楚,如果需要澄清,请告诉我。谢谢。是的,它将由perl自己缓存。(mod_perl关于此主题的任务只是将脚本翻译成可缓存的包,并注意保持perl始终运行,而不是在响应完成时退出。) 不过,您必须了解这在各种httpd mpm中是如何实现的。请注意,进程具有独立的%INC和prefork。下面的示例程序将需要为每个新的子进程动态加载模块。这意味着前两个请求将比平均速度慢,因为它们是循环处理的。模块被缓存,直到子模块退出,因为它已达到其最大请求阈值,然后每个新子模块都必须再次加载
package Foo;
use Apache2::Const -compile => qw(OK);
use Apache2::RequestIO qw();
use Apache2::RequestRec qw();
use Data::Dumper qw(Dumper);
sub handler {
my ($r) = @_;
$r->content_type('text/plain');
$Data::Dumper::Sortkeys = 1;
$r->print(Dumper \%INC);
my $module = 'Template';
eval {
(my $file = $module) =~ s|::|/|g;
require $file . '.pm';
$module->import();
1;
} or die $@;
$r->print(Dumper \%INC);
return Apache2::Const::OK;
}
1;
通常建议在分叉发生之前,通过在服务器启动时加载可能需要的任何模块来优化性能。服务器硬件应具有足够的内存,以使模块延迟加载的权衡变得不必要。非常感谢您提供了有见地的答案。这正是我想要的。类似地,有没有什么好的理由(除了Apache启动时间)不预加载任何任意子进程生命周期中可能使用的所有模块?再次感谢,非常有用的答案。我能想到的另一个原因是:试图加载互不兼容的模块。我个人还没有遇到过这种情况,通常会有一些更好的方法来解决这类问题。