2009-06-26 3 views
3

Некоторые цитаты выбрать из практики mod_perlCalling очистить код в 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 (суб {#cleanup});

Однако

  1. Как я могу получить $ г в a.cgi сценария?
  2. Может ли подпрограмма получить доступ к переменной моего флага области?
  3. Этот параметр $ r-> register_cleanup должен быть помещен в скрипт a.cgi? Я хочу, чтобы код очистки был выполнен для сценария a.cgi. Не все остальное.

ответ

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

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

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

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() });