【问题标题】:Getting the request object outside a mod_perl handler在 mod_perl 处理程序之外获取请求对象
【发布时间】:2014-07-22 07:46:38
【问题描述】:

我想从一个从 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

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

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

【问题讨论】:

    标签: apache perl apache2 mod-perl


    【解决方案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 类型等。

    如果你使用这种方法,你必须在你的httpd.conf Apache httpd 配置文件中写上PerlOptions +GlobalRequest

    详情请见perldoc Apache2::RequestUtil

    【讨论】:

    • 是的,这正是我想要的。谢谢。
    猜你喜欢
    • 2021-05-31
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    • 2015-02-17
    • 1970-01-01
    • 2017-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多