mod_perl缓存模块是否动态加载?

时间:2012-02-09 04:50:54

标签: perl apache mod-perl

我先做了一点搜索,但还没有找到满意的答案(如果这是一个重复的问题,我会道歉 - 或者更糟糕的是,这是一个愚蠢的问题)......

动态加载的Perl模块(如this question的答案中包含的模块(下面复制的相关代码)是否会被mod_perl正确缓存以供将来使用?

my $module = 'My::Module';

eval {
    (my $file = $module) =~ s|::|/|g;
    require $file . '.pm';
    $module->import();
    1;
} or do {
    my $error = $@;
    # ...
};

在上面的例子中,如果子程序在将来类似地试图要求它(至少以mod_perl通常用于包缓存的任何方式),那么在调用之后将通过mod_perl缓存“My :: Module”以供将来使用吗?

希望这个问题有点清楚,如果需要澄清,请告诉我。感谢。

1 个答案:

答案 0 :(得分:2)

是的,它将由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;

通常建议在分叉之前加载服务器启动时可能需要的任何模块来优化性能。服务器硬件应该有足够的内存来使模块延迟加载权衡是不必要的。