在mod_perl 2

时间:2016-08-29 21:28:03

标签: apache perl mod-perl mod-perl2

我试图找出是否有办法在mod_perl 2下完成响应而不返回主处理程序。到目前为止,Haven已经能够在文档中找到一种方法。以下是我试图实现的一个例子:

#!/usr/bin/perl
# This is some mod_perl handler
use strict;
use warnings;
use Apache2::Const ':common';

sub handler {
    my $r = shift;
    if ($r->method eq 'POST') {
        # just to do something as example
        do_post_response($r);
    }
    $r->content_type('text/plain');
    print "Thank you, goodbye.";
    return Apache2::Const::OK;
}

sub do_post_response {
    my $r = shift;
    unless (check_somthing()) {
        # Suppose I find a situation that requires
        # a different response than normal...
        $r->content_type('text/plain');
        print "We have a situation...";
        $r->something_to_finish_the_request_immediatly(Apache2::Const::OK);
    }
}

在常规Perl脚本中,单独运行或在mod_cgi下运行,我只能exit()使用新响应,但在mod_perl下我需要返回原始handler中的内容子程序。这导致我跟踪整个调用链,其中所有人都必须返回一些东西,直到我回到主handler

例如,而不是:

unless (check_something()) { ...

我需要做以下事情:

my $check = check_something();
return $check if $check;

并且我还必须在主处理程序中执行类似的操作,这对于某些情况处理来说非常不合适。

有没有办法在嵌套调用中关闭请求,就像我试图用我的例子说明的那样?

编辑:我发现我可以调用goto LABEL并在主handler子例程中最后一次返回之前放置该标签。它有效,但仍然感觉像一个肮脏的黑客。我真的希望有更好的方式。

1 个答案:

答案 0 :(得分:2)

我认为你仍然可以调用exit(),因为mod_perl会覆盖退出的内容:

  

退出

     

在正常的Perl代码中,exit()用于停止程序流并退出Perl解释器。但是在mod_perl下我们只想停止程序流而不杀死Perl解释器。

     

如果您的代码包含exit()调用,则不应采取任何操作,并且可以继续使用它们。 mod_perl担心使用自己的版本覆盖exit()函数,该版本停止程序流,并执行所有必要的清理,但不会终止服务器。这是通过覆盖来完成的:

     

* CORE :: GLOBAL :: exit = \& ModPerl :: Util :: exit;

https://perl.apache.org/docs/2.0/user/coding/coding.html