Получаване на обекта на заявката извън манипулатор на 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