Получение объекта запроса вне обработчика mod_perl

Я хочу войти в файл журнала Apache из подпрограммы, которая вызывается из обработчика mod_perl, но не имеет объекта запроса ($ r).

sub handler {
    my ($r) = shift;
    ...
    Common::subroutine_that_also_logs();
    ...
}

package Common;
sub subroutine_that_also_logs {
    ...
    # $r->log->info('cannot do this')
    ...
}

При использовании print STDERR или warn работает, но я хочу использовать Apache2 :: Log для получения дополнительной информации о запросе в журнале: -

[Fri May 30 16:12:37 2014] [info] [client 123.123.123.123] cannot do this

вместо просто

cannot do this

Я хочу избежать глобальной инициализации в обработчике, поскольку это означало бы обновление нескольких сотен обработчиков: -

my $globalr;
sub handler {
    $globalr = shift;
    ...
    Common::subroutine_that_also_logs();
}

package Common;
sub subroutine_that_also_logs {
    ...
    $globalr->log->info('can try this')
    ...
}

Я установил один PerlFixupHandler для инициализации $globalr, но мне интересно, есть ли лучший способ или $r доступен напрямую другими способами.


person Himanshu    schedule 02.06.2014    source источник


Ответы (1)


Вы можете использовать Apache2::RequestUtil.

package Common;
use Apache2::RequestRec;
use Apache2::RequestUtil;

sub subroutine_that_also_logs {
    my $r = Apache2::RequestUtil->request;
    # some process you want using $r
}

Если эта фаза - PerlFixupHandler, $r содержит всю информацию о запросе, например. MIME-типа и так далее.

Если вы используете этот метод, вам нужно написать PerlOptions +GlobalRequest в httpd.conf файле конфигурации Apache httpd.

См. Подробности в perldoc Apache2::RequestUtil.

person OGATA Tetsuji    schedule 03.06.2014
comment
Да это именно то, что я хотел. Спасибо. - person Himanshu; 03.06.2014