gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:18:58 24 4
gpt4 key购买 nike

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

动态加载 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 通常用于包缓存的任何方式),那么在这次调用之后“My::Module”是否会被 mod_perl 缓存以备将来使用?

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

最佳答案

是的,它会被perl自己缓存。 (mod_perl 关于这个主题的任务只是将脚本翻译成可缓存的包,并注意保持 Perl 一直运行而不是在响应完成时退出。)

不过,您必须了解这在各种 httpd MPM 中是如何发挥作用的。请注意,进程具有独立的 %INC。使用 prefork,下面的示例程序将需要为每个新 child 动态加载模块。这意味着前几个请求将比平均速度慢,因为它们是循环处理的。该模块会被缓存,直到 child 因为达到其最大请求阈值而退出,然后每个新的 child 都必须再次加载。

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;

通常建议通过在 fork 发生之前在服务器启动时加载您可能需要的任何模块来优化性能。服务器硬件应该有足够的内存来避免模块延迟加载的权衡。

关于perl - mod_perl 缓存模块是否动态加载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9205596/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com