Вызов кода очистки в среде mod_perl - PullRequest
3 голосов
/ 26 июня 2009

Некоторые цитаты из практического 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. Может ли подпрограмма получить доступ к переменной my scope flag?
  3. Должно ли это $ r-> register_cleanup быть помещено в сценарий a.cgi? Я хочу, чтобы код очистки выполнялся только для сценария .cgi. Не остальное.

Ответы [ 2 ]

4 голосов
/ 26 июня 2009
  1. my $ r = Apache-> request;

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

  3. Да, регистрировать функцию, только если вы хотите, чтобы она работала.

1 голос
/ 26 июня 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() } );
...