Вызов кода очистки в среде 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 нужно поместить в скрипт cgi? Я хочу, чтобы код очистки выполнялся только для сценария a.cgi. Не остальные.

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


Ответы (2)


  1. мой $r = Apache->запрос;

  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.

Если вы этого хотите, вы должны поместить свой код очистки в подпрограмму и вызвать эту подпрограмму из своей проверки в CGI:

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

и из вашего обработчика очистки:

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