我试图找出是否有一种方法来完成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;
和我也必须在主处理程序中做一些类似的事情,这对于某些情况处理来说非常笨拙。
是否有一种方法来关闭请求时,在一个嵌套的调用,就像我试图用我的例子说明?
EDIT:我发现我可以调用goto LABEL
并将该标签放置在主handler
子例程的最后返回之前。它可以工作,但仍然感觉像一个肮脏的黑客。我真希望有更好的办法。
我认为你仍然可以调用exit(),因为mod_perl覆盖了exit的作用:
https://perl.apache.org/docs/2.0/user/coding/coding.html
在普通Perl代码中,exit()用于停止程序流程并退出Perl解释器。然而,在mod_perl中,我们只想停止程序流而不杀死Perl解释器。
如果您的代码包含exit()调用,则不应采取任何操作,并且可以继续使用它们。Mod_perl担心用自己的版本覆盖exit()函数,该函数会停止程序流,并执行所有必要的清理,但不会终止服务器。这是通过重写:
来实现的:*核心::全球::退出= ,ModPerl: Util:退出;