mod_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

我先搜索了一下,但还没有找到满意的答案(如果这是一个重复的问题,或者更糟的是,一个愚蠢的问题,我深表歉意)

mod_Perl是否正确缓存了动态加载的Perl模块,如答案(下面复制的相关代码)中包含的模块,以备将来使用

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启动时间)不预加载任何任意子进程生命周期中可能使用的所有模块?再次感谢,非常有用的答案。我能想到的另一个原因是:试图加载互不兼容的模块。我个人还没有遇到过这种情况,通常会有一些更好的方法来解决这类问题。