Извикване на код за почистване в среда 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. Как мога да получа $r в a.cgi скрипт?
  2. Може ли подпрограмата да има достъп до променливата на моя обхват?
  3. Това $r->register_cleanup трябва ли да бъде поставено в a.cgi скрипт? Искам кодът за почистване да бъде изпълнен само за a.cgi скрипт. Не останалото.

person Cheok Yan Cheng    schedule 26.06.2009    source източник


Отговори (2)


  1. my $r = Apache->request;

  2. Да, но вижте http://modperlbook.org/html/6-2-Exposing-Apache-Registry-Secrets.html и следващите няколко страници относно обхвата на локалните променливи и функции.

  3. Да, регистрирайте функцията само ако искате да работи.

person Stobor    schedule 26.06.2009

Ако разбирам това правилно, имате скрипт, който искате да стартирате както под mod_perl, така и като обикновен CGI и изглежда, че използвате Apache::Registry, за да направите това.

Имате код за почистване, който искате да изпълнявате само, когато изпълнявате като CGI скрипт.

Трябва да откриете дали работите под mod_perl или не. Това е доста лесно. Най-простият начин е да проверите вашата среда:

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

Трябва само да регистрирате манипулатор за почистване, ако искате нещо да се изпълнява, когато вашият скрипт приключи под Apache::Registry.

Ако искате това, трябва да поставите своя код за почистване в sub и да извикате този sub от вашата проверка в CGI:

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

и от вашия манипулатор за почистване:

my $r = Apache->request;
$r->register_cleanup(sub { cleanup_sub() } );
person Nic Gibson    schedule 26.06.2009