在mod_perl处理程序之外获取请求对象

时间:2014-06-02 08:34:49

标签: apache perl apache2 mod-perl

我想从一个从mod_perl处理程序调用但没有请求对象($ r)的子例程登录到Apache日志文件。

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

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

使用print STDERRwarn时,我想使用Apache2 :: Log在日志中获取其他请求信息: -

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

而不仅仅是

cannot do this

我想避免处理程序中的全局init,因为这意味着更新几百个处理程序: -

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是否可以通过其他方式直接使用。

1 个答案:

答案 0 :(得分: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 Apache httpd配置文件上写httpd.conf

有关详细信息,请参阅perldoc Apache2::RequestUtil