Fra*_*ozo 14 apache perl mod-perl mod-perl2
我试图找出是否有办法在mod_perl 2下完成响应而不返回主处理程序.到目前为止,还没有在文档中找到方法.以下是我正在尝试实现的示例:
#!/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主子程序中的最后一次返回之前调用并放置该标签.它有效,但仍然感觉像一个肮脏的黑客.我真的希望有一个更好的方式.
我认为你仍然可以调用 exit() 因为 mod_perl 覆盖了 exit 的作用:
出口
在正常的 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
| 归档时间: | 
 | 
| 查看次数: | 140 次 | 
| 最近记录: |