Como faço o Apache concluir a execução de scripts Perl depois que o navegador da Web é fechado?

3

Eu tenho um script Perl que é ativado por um usuário final clicando em um atalho em um navegador da web. O script percorre uma lista de valores hash. Ele envia ao navegador algum HTML quando insere uma linha no banco de dados para cada iteração. O ambiente era Perl, Windows Server 2003 Standard Edition, IIS. Recentemente migrei para o Apache. Tradicionalmente, o número de iterações era pequeno e a maioria dos usuários fechava o navegador após o carregamento da página. Agora, temos um caso em que existem até 5000 iterações. Agora leva muito tempo (1 min ~) para executar as 5000 iterações. Esse não é o problema. O problema é que quando o usuário fecha o navegador da Web, o Apache mata o script Perl e nós não terminamos de inserir as linhas no banco de dados porque o navegador não reconhece o html enviado mais recentemente. Eu testei isso no IIS e depois que o usuário fecha o navegador da Web, o script Perl continua a ser executado e todas as linhas são inseridas. Existe uma configuração no arquivo de configuração do Apache que forçará o Apache a concluir a execução do script Perl mesmo depois que o navegador for fechado e o soquete for descartado?

Isso é o que estamos fazendo:

foreach my $Destination (sort keys %{$self->{_Destinations}}) {
   print qq! <td $self->{_bgcolor}>$Destination Queued</td> !;

   if ($self->{_Data}->Execute(@params))   {&error}
}

Eu sei que deveríamos fazer todas as inserções do banco de dados e ENTÃO imprimir, mas este é um código legado e se eu conseguisse fazer com que o Apache se comportasse como o IIS a esse respeito, eu teria tempo para fazer uma reescrita mais completa deste script.

    
por Jason Lamoreux 12.01.2010 / 23:31

2 respostas

5

Você precisa colocar qualquer trabalho que deva acontecer mesmo que o navegador esteja fechado / a conexão seja encerrada em um trabalho em segundo plano. Use uma fila de trabalho (gosto de resque, mas praticamente tudo vai funcionar) e um processador de trabalho para recuperar os trabalhos e fazer a inserção necessária. Perguntas sobre como escrever esse código são mais bem feitas no stackoverflow.

    
por 12.01.2010 / 23:49
0

Em um servidor Unix, em seus scripts perl você pode tentar ignorar os sinais, por exemplo,

$SIG{'TERM'}='IGNORE';
$SIG{'HUP'}='IGNORE';
$SIG{'PIPE'}='IGNORE';

Isso provavelmente não é útil se você estiver executando servidores Windows.

Em unices, isso pode gerar outros problemas.

    
por 13.02.2010 / 13:31