2012-02-09 28 views
3

我做了一個小搜索,但還沒有找到滿意的答案(我很抱歉,如果這是一個重複的問題 - 或者更糟,一個愚蠢的問題)...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 = [email protected]; 
    # ... 
}; 

在上述例子中,將「我的::模塊」,如果一個子程序類似於試圖要求它在未來(至少在任何方式的mod_perl通常使用對於這個調用以供將來使用後的mod_perl被緩存包緩存)?

希望這個問題有點清楚,請讓我知道是否需要澄清。謝謝。

回答

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 [email protected]; 

    $r->print(Dumper \%INC); 
    return Apache2::Const::OK; 
} 

1; 

通常建議以優化性能通過加載分叉發生之前,你可能需要在已有的服務器啓動任何模塊。服務器硬件應該有足夠的內存來使模塊延遲加載權衡不必要。

+0

非常感謝您提供有見解的答案。這正是我所期待的。同理,除了Apache啓動時間之外,是否有任何好的理由使_not_預加載在任意子進程的生命週期中可能使用的所有模塊?再次感謝,非常有幫助的答案。 – StudyOfCrying 2012-02-09 15:56:09

+0

我能想到的另一個原因是:嘗試加載互不兼容的模塊。我個人還沒有遇到過這種情況,通常對於那些問題存在一些更好的解決方法。 – daxim 2012-02-09 18:39:48