Модули кеша mod_perl загружаются динамически? - PullRequest
3 голосов
/ 09 февраля 2012

Сначала я немного поискал, но пока не нашел удовлетворительного ответа (извиняюсь, если это повторный вопрос - или, что еще хуже, глупый вопрос) ...

Делаем динамически загружаемые модули Perlнапример, включенные в ответ на этот вопрос (соответствующий код повторяется ниже), должным образом кэшируется mod_perl для будущего использования?

my $module = 'My::Module';

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

В приведенном выше примере будет "My ::Модуль "будет кэшироваться mod_perl после этого вызова для будущего использования, если подпрограмма аналогичным образом пытается потребовать его в будущем (по крайней мере, каким-либо образом, который mod_perl обычно использует для кэширования пакетов)?

Надеюсь, этот вопрос несколько ясен,пожалуйста, дайте мне знать, если какие-либо разъяснения необходимы.Благодаря.

1 Ответ

2 голосов
/ 09 февраля 2012

Да, он будет кэшироваться самим 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;

Обычно рекомендуется оптимизировать производительность, загружая любой модуль, который вы могли быНужно уже при запуске сервера, прежде чем происходит разветвление.Аппаратное обеспечение сервера должно иметь достаточно памяти, чтобы исключить необходимость ленивой загрузки модуля.

...