在mod_perl环境中调用清理代码

时间:2009-06-26 04:22:21

标签: perl mod-perl

从实用的mod_perl中选择一些引用

“通常,单个进程在退出之前会处理许多请求,因此如果期望在每个请求的处理结束时执行某些操作,则无法使用END块。”

所以,在我的a.cgi脚本中:

my $flag = 1;

END {
    # Value for $flag is undefined, if this script is run under mod_perl. 
    # END block code only executed when process to handle a.cgi exit. 
    # I wish to execute some code, just before process to handle a.cgi exit.
    if ($flag) {
        # clean up code.
    }
}

这本书重新开始$ r-> register_cleanup(sub {#cleanup});

然而,

  1. 如何在a.cgi脚本中获取$ r?
  2. 子程序可以访问my scope flag变量吗?
  3. 这个$ r-> register_cleanup应该放在a.cgi脚本中吗?我只希望为a.cgi脚本执行清理代码。不是其余的。

2 个答案:

答案 0 :(得分:4)

  1. 我的$ r = Apache->请求;

  2. 是的,但请参阅http://modperlbook.org/html/6-2-Exposing-Apache-Registry-Secrets.html和接下来的几页,了解局部变量和函数的范围。

  3. 是的,只有在您希望它运行时才注册该功能。

答案 1 :(得分:1)

如果我理解正确,你有一个你想要在mod_perl下运行的脚本和一个普通的CGI,听起来你正在使用Apache::Registry来执行此操作。

当您作为CGI脚本运行时,您需要运行 的清理代码。

您需要检测是否在mod_perl下运行。这很容易。最简单的方法是检查您的环境:

unless ($ENV{MOD_PERL})
{
   #... cleanup code here.
}

如果您希望在Apache :: Registry下脚本终止时运行某些内容,则只需注册清理处理程序。

如果你想要那样,你应该把你的清理代码放到一个子中,然后从你在CGI中的支票中调用那个子:

unless ($ENV{MOD_PERL})
{
   cleanup_sub();
}

并从你的清理处理程序:

my $r = Apache->request;
$r->register_cleanup(sub { cleanup_sub() } );