3

从实用的 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. 子例程可以访问我的范围标志变量吗?
  3. 这个 $r->register_cleanup 应该放在 a.cgi 脚本中吗?我只希望为 a.cgi 脚本执行清理代码。不是其余的。
4

2 回答 2

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

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

  3. 是的,仅当您希望它运行时才注册该功能。

于 2009-06-26T04:52:37.310 回答
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() } );
于 2009-06-26T10:43:41.970 回答