[Cascavel-pm] dúvida ao usar CGI::Carp
Alceu Rodrigues de Freitas Junior
glasswalk3r em yahoo.com.br
Segunda Agosto 2 18:17:23 CDT 2004
On Mon, 2 Aug 2004 10:20:20 -0300 (BRT) Luis Champs de Carvalho
<monsieur_champs em yahoo.com.br> wrote:
> On Mon, 2 Aug 2004, Alceu Rodrigues de Freitas Junior wrote:
> > Alguém já fez uso de CGI::Carp para gerar mensagens decentes no log
> > do Apache?
>
> É a quinta linha de qualquer programa perl que eu faço com padrão
> web.
>
> -----------
> $ head -n5 ~/src/*/bin/* | sort -u
> #!/usr/bin/perl
> use strict;
> use warnings;
> use diagnostics;
> use CGI::Carp qw/ fatalsToBrowser /;
> -----------
>
> > Eu estava usando o módulo sem problemas até usar a pragma "use
> > signals". Basicamente habilitei o CGI para chamar uma função ao
> > receber um sinal TERM. A função faz alguma coisa e encerra com um
> > "die".
>
> Você deve estar falando do pragma "sigtrap", já que eu não fui capaz
> de
> encontrar um outro parecido... vamos ver mais...
é verdade, desculpe:
use sigtrap 'handler' => \&terminated, 'normal-signals';
Isto é exatamente o que estou usando.
> > Para minha surpresa, ao invés de mandar uma mensagem com timestamp e
> > tudo o mais para o log do Apache, o CGI mandou apenas a mensagem do
> > "die".
>
> Isso por que você deve estar instalado os handlers de sinal nesta
> ordem:
>
> -------
> use sigtrap qw( die );
> use CGI::Carp qw( fatalsToBrowser );
> -------
Na verdade não, isso é a parte confusa da história. Segue a "salada":
use CGI;
use warnings;
use strict;
use CGI::Carp;
use LWP 5.66;
use URI::Split qw (uri_split);
use sigtrap 'handler' => \&terminated, 'normal-signals';
use Digest::MD5 qw(md5_base64);
use IPC::Open3;
> > Alguém saberia dizer por que isso ocorre? Eu testei mandar a função
> > que captura o sinal TERM carregar o módulo CGI::Carp, mas o
> > resultado é o mesmo.
>
> Simples: você está se esquecendo de que o perl não oferece um
> mecanismo
> simples para lidar com "correntes" de signal handlers instalados para
> lidar com um mesmo sinal. Quando você diz "use sigtrap" o que acontece
> é que o módulo "invade" seu espaço (a seu convite, claro!) e instala
> um signal handler para você. Lamentavelmente, quando você usa o "use
> CGI::Carp", acontece novamente a mesma coisa, e não existe forma
> simples de fazer com que um módulo saiba da existência do outro...
Mas quando eu solicito que eles invadam o "espaço" do programa, esse
espaço não é compartilhado pelos dois módulos? Isso me deixou meio
confuso, já que nunca tive esse tipo de problema, até o momento.
> Você precisa mesmo usar os dois?
Ah, sim. Isso me ajuda muito. Eu resolvi desta forma:
sub terminated {
my $date = localtime(time);
die "[$date] viralator.cgi:warning: request process killed by
$client\n";
}
Isso faz exatamente o que o CGI::Carp faria por mim. Mas estou
duplicando o código, algo indesejável.
> Acho que poderia ter outra forma de fazer, talvez sem usar o
> import()
> dos módulos, mas algum mecanismo seu... assim:
>
> #!/usr/bin/perl
> # repare na lista vazia passada para os módulos:
> # isso garante que não haverá chamada ao método "import()".
> use sigtrap ();
> use CGI::Carp ();
Mas os métodos são acessíveis do mesmo jeito, certo? Eu nunca especifico
o que quero usar com o módulo CGI.pm, por exemplo. Eu simplesmente uso:
use CGI;
> # Mais adiante, você deve escolher como lidar com os sinais, assim:
> use vars qw/ %SIG /;
> $SIG{__DIE__} = sub{
> CGI::Carp::handler_adequado();
> sigtrap::handler_adequado();
> }; # Não esquece o ';' no final da linha,
> # isto ainda é uma atribuição!
> # Continua...
> __END__
Acho que nesse caso, usar a pragma sigtrap não me ajuda nada... afinal
ou que eu procuro são apelidos para os sinais.
> Espero que isso ajude você.
> Penso que a grande "sacada" agora é descobrir ou implementar o
> handler
> que melhor se adapte ao seu problema, usando as funcionalidades de um
> e de outro módulo...
Na verdade, eu ainda estou bastante confuso do porque disso não ter
funcionado.
[]'s
--
Alceu Rodrigues de Freitas Junior
--
glasswalk3r em yahoo.com.br
PGP public key at http://www.imortais.cjb.net/addgb.html
---------------------------------------------------------------
He who knows others is wise.
He who knows himself is enlightened.
-- Lao Tsu
Mais detalhes sobre a lista de discussão Cascavel-pm