<a href="http://perl.apache.org/docs/1.0/guide/troubleshooting.html#Evil_things_might_happen_when_using_PerlFreshRestart">http://perl.apache.org/docs/1.0/guide/troubleshooting.html#Evil_things_might_happen_when_using_PerlFreshRestart</a><br>

<br><div class="gmail_quote">2011/10/24 Eduardo Almeida <span dir="ltr"><<a href="mailto:eduardo@web2solutions.com.br">eduardo@web2solutions.com.br</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

<div class="im"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
mod_perl<br>
</blockquote>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
É uma forma de rodar o seu código diretamente no processo do apache. É<br>
mais rápido que o FastCGI (acho até que é o mais rápido, mas nao<br>
conferi) e tem uma boa gama de problemas. É uma das "gambiarras" mais<br>
usadas pra melhorar performace de CGI. É semelhante ao que o PHP faz.<br>
</blockquote>
<br></div>
Blabos, poderia falar mais sobre "tem uma boa gama de problemas" ?!?<br>
<br>
Obrigado ..<br>
<br>
<br>
<br>
<br>
Eduardo Almeida - Engenharia de Software<br>
<a href="mailto:eduardo@web2solutions.com.br" target="_blank">eduardo@web2solutions.com.br</a> - 27 3021-1530 / 27 9600-0395<br>
<br>
WEB2 Solutions - Inovando, sempre!<br>
-----Original Message----- From: Blabos de Blebe<br>
Sent: Monday, October 24, 2011 11:18 AM<br>
To: <a href="mailto:saopaulo-pm@mail.pm.org" target="_blank">saopaulo-pm@mail.pm.org</a><br>
Subject: Re: [SP-pm] Como fazer?<div><div></div><div class="h5"><br>
<br>
Ok, vejamos se eu consigo complementar o que o Eden disse...<br>
<br>
Vou partir do princípio que você está querendo descobrir qual a<br>
pergunta, porque era assim que eu estava quando fazia as suas<br>
perguntas.<br>
<br>
Vou usar de licença poética, vulgo, dados incompletos ou exagerados em<br>
algum ponto.<br>
<br>
Reset geral...<br>
<br>
HTTP<br>
<br>
Primeiramente, HTTP é um protocolo, ou seja é um acordo feito entre as<br>
duas partes, cliente e servidor, sobre como conversar. É como se eu<br>
chegasse pra alguém na rua e dissesse:<br>
<br>
_Oi, fala português?<br>
_Sim, falo.<br>
_Então vamos bater um papo.<br>
...<br>
<br>
Eu, pessoalmente acho o HTTP robusto demais pra ficar obsoleto em<br>
breve, pois ele ainda é sub-sub-utilizado. Talvez um HTTP 1.2 ou 2.0.<br>
<br>
Você pode dar uma olhada em:<br>
<a href="https://github.com/blabos/Docs/wiki/Protocolo-HTTP" target="_blank">https://github.com/blabos/<u></u>Docs/wiki/Protocolo-HTTP</a><br>
<br>
Servidor Web<br>
<br>
Um servidor web (vou usar esse termo com licença poética) é uma<br>
aplicação que ao subir, fica escutando em uma porta específica. Ao<br>
receber uma requisição de um cliente, ele escolhe uma estratégia pra<br>
tratá-la, e responde de acordo, no caso, de acordo com o que ele<br>
quiser responder, mas é comum seguir algum padrão.<br>
<br>
CGI, cgi e CGI.pm<br>
<br>
CGI, Common Gateway Interface, é um padrão de interface. Entre quem?<br>
Entre o servidor web e a sua aplicação.<br>
<br>
Se sua aplicação segue o padrão cgi, não importa em que linguagem, ela é um cgi.<br>
<br>
Ex:<br>
<br>
#include <stdio.h><br>
<br>
int main(void) {<br>
   printf("Content-Type: text/html\n\n");<br>
}<br>
<br>
Pronto, uma aplicação cgi em C. Faça o teste.<br>
<br>
CGI.pm é um framework em Perl que te fornece diversas facilidades para<br>
trabalhar dentro do padrão CGI. As que eu mais gosto são a CGI::param<br>
e a CGI::cookie. Dá pra brincar muito só com isso.<br>
<br>
<br>
A principal característica do CGI é que toda vez que o cliente pedir<br>
ao servidor para executar um cgi, ou seja a cada refresh do browser, o<br>
servidor precisa fazer um fork, seguido de exec e isso é inerentemente<br>
lento. Por quê? Dever de casa.<br>
<br>
<a href="http://www.cs.vu.nl/~ast/" target="_blank">http://www.cs.vu.nl/~ast/</a><br>
<br>
<br>
<br>
FastCGI e FCGI<br>
<br>
O FastCGI é um novo padrão de conversa entre servidor e aplicação.<br>
Basicamente ele diz que ao invés de abrir um novo processo, o servidor<br>
deve manter um processo rodando e aproveitá-lo entre as requisições.<br>
<br>
É mais rápido que o CGI.<br>
<br>
<br>
mod_perl<br>
<br>
É uma forma de rodar o seu código diretamente no processo do apache. É<br>
mais rápido que o FastCGI (acho até que é o mais rápido, mas nao<br>
conferi) e tem uma boa gama de problemas. É uma das "gambiarras" mais<br>
usadas pra melhorar performace de CGI. É semelhante ao que o PHP faz.<br>
<br>
<br>
Catalyst, Mojlicious e Dancer<br>
<br>
São frameworks para construção de aplicações MVC, cada um com suas<br>
peculiaridades. Já implementam as interfaces padrão com o servidor,<br>
deixando pra você se preocupar somente com a sua aplicação, que cada<br>
um vai dar o seus pulos pra conversar com o servidor sem te importunar<br>
muito com esses detalhes.<br>
<br>
Ou seja, não se preocupe com configurações e concentre-se na sua aplicação.<br>
<br>
<br>
Cookie<br>
<br>
O Cookie é uma sacada genial, que possui seus problemas, mas permite<br>
ao HTTP, que é um protocolo state-less, emular uma máquina de estados,<br>
vulgo sessão.<br>
<br>
<br>
Recapitulando:<br>
<br>
Host Cliente <-- ( TCP/IP ) --> Host Servidor<br>
<br>
Aplicação Cliente <--( HTTP ) --> Aplicação Servidor<br>
<br>
Servidor Web <--( CGI/FastCGI/PSGI/WSGI ) -> Aplicação Web<br>
<br>
Note as várias camadas. O Eden deu um ótimo curso sobre isso na FEI.<br>
Se ele repetir em janeiro, eu recomendo.<br>
<br>
<br>
...<br>
<br>
Esses conceitos são super simples, mas fundamentais pra começar a<br>
fazer as perguntas certas. O problema é que esses cursos web de banca<br>
de jornal passam por cima e ensinam a trabalhar somente com um cenário<br>
bem específico.<br>
<br>
Não fosse assim talvez os buzzwords soap, wsdl, webservice e muitos<br>
outros poderiam ter sido simplesmente mais uma aplicação restfull...<br>
<br>
Qualquer dúvida, google, depois pergunta :)<br>
<br>
<br>
[]'s<br>
<br>
<br>
2011/10/24 Eden Cardim <<a href="mailto:edencardim@gmail.com" target="_blank">edencardim@gmail.com</a>>:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


"Rafael" == Rafael Silveira <<a href="mailto:design.silveira@gmail.com" target="_blank">design.silveira@gmail.com</a>> writes:<br>
</blockquote></blockquote></blockquote></blockquote></blockquote>
<br>
   Rafael> Boa noite galera, tentarei ser direto!<br>
   Rafael> Tenho o código a seguir<br>
<br>
   Rafael> package MyApp::HomeController;<br>
<br>
   Rafael> use base qw{Controller};<br>
<br>
   Rafael> sub new {<br>
   Rafael> }<br>
<br>
   Rafael> sub index {<br>
   Rafael>    ...<br>
   Rafael> }<br>
<br>
   Rafael> 1;<br>
<br>
   Rafael> Qual a melhor forma de criar um server http, para qndo eu<br>
   Rafael> acessar localhost/Home/index do meu browser eu obter o<br>
   Rafael> retorno do metodo index?<br>
<br>
Sendo direto, não dá pra explicar a melhor forma dentro de um email. É<br>
igual perguntar a melhor forma de implementar um sistema operacional. A<br>
sua pergunta é difícil e a resposta, por consequência, vai ser<br>
difícil. Mas, assumindo que uma forma "não-melhor" é tolerável, aqui<br>
vai:<br>
<br>
--8<---------------cut here---------------start------<u></u>------->8---<br>
package MyApp;<br>
use warnings;<br>
use strict;<br>
use IO::Socket;<br>
use Net::hostent;    # for OO version of gethostbyaddr<br>
<br>
my $PORT = 9000;<br>
<br>
sub run {<br>
   my ($class) = @_;<br>
   my $server = IO::Socket::INET->new(<br>
       Proto     => 'tcp',<br>
       LocalPort => $PORT,<br>
       Listen    => SOMAXCONN,<br>
       Reuse     => 1<br>
   );<br>
<br>
   die "can't setup server" unless $server;<br>
<br>
   printf STDERR "[Server $0 accepting clients]\n";<br>
<br>
   while ( my $client = $server->accept() ) {<br>
       my $hostinfo = gethostbyaddr( $client->peeraddr );<br>
       printf STDERR "[Connect from %s]\n",<br>
         $hostinfo ? $hostinfo->name : $client->peerhost;<br>
<br>
       my ( $method, $req_uri, $http_ver ) = split ' ', scalar <$client>;<br>
       my $c_method = $class->uri_to_method($req_<u></u>uri);<br>
       print $client "$http_ver 200 OK\n";<br>
       print $client "Content-type: text/plain\n\n";<br>
       print $client MyApp::Controller->$c_method($<u></u>client);<br>
       print $client "\n";<br>
   }<br>
}<br>
<br>
sub uri_to_method {<br>
   my ( $class, $uri ) = @_;<br>
   $uri =~ s{/+}{_}g;<br>
   $uri .= 'index' if $uri eq '_';<br>
   return $uri;<br>
}<br>
<br>
package MyApp::Controller;<br>
use warnings;<br>
use strict;<br>
<br>
sub _index { 'Hi, you hit the index' }<br>
<br>
sub _foo { 'Whoa, you hit foo' }<br>
<br>
sub _bar { 'Hey there, you hit bar' }<br>
<br>
sub AUTOLOAD { 'not found' }<br>
<br>
package main;<br>
<br>
MyApp->run;<br>
--8<---------------cut here---------------end--------<u></u>------->8---<br>
<br>
Coloca isso num arquivo e roda, depois abre <a href="http://localhost:9000" target="_blank">http://localhost:9000</a> no<br>
browser. Isso é uma implementação porta e grosseira extraída de perldoc<br>
perlipc que basicamente faz 80% do que os servers como o apache, nginx,<br>
HTTP::Server, Starman fazem. A "melhor forma" você vai encontrar olhando<br>
pro source de cada uma dessas implementações. Os outros 20% você termina<br>
em alguns anos, até lá, o HTTP provavelmente já estará caminhando para a<br>
obsolescência. De qualquer forma, a especificação se encontra em<br>
<a href="http://www.w3.org/Protocols/rfc2616/rfc2616.html" target="_blank">http://www.w3.org/Protocols/<u></u>rfc2616/rfc2616.html</a>, boa sorte!<br>
<br>
   Rafael> Desculpe de novo, essa "mesma" pergunta, só que dessa vez<br>
   Rafael> quero exemplificar dessa forma!<br>
<br>
   Rafael> Nao sei qual lib usar para o HTTP, talvez um CGI::Fast ou<br>
   Rafael> qlqr outra lib!<br>
<br>
Porque você quer usar essas libs mas não quer usar as que já fazem algo<br>
mais próximo do que você quer? Onde é o seu critério de corte? E porque<br>
você está na dúvida se usa HTTP ou CGI, você realmente sabe o que eles<br>
fazem e a relação entre os dois?<br>
<br>
   Rafael> Mas por gentileza, gostaria de saber dessa forma!<br>
<br>
   Rafael> Como vocês sabem estou aprendendo perl, ja me deram as dicas<br>
   Rafael> para aprender Catalyst, mas antes, gostaria de descobrir<br>
   Rafael> como fazer isso!<br>
<br>
   Rafael> Desde já agradeço!<br>
<br>
Repetindo, se você olhar no fonte do Catalyst, vai encontrar uma<br>
implementação similar e muito melhor do que essa colada acima. Mas pra<br>
você entender o fonte, precisa entender o que ele está se propondo a<br>
fazer. De novo, eu sugiro que você aprenda a implementar algo bem básico<br>
usando um framework, nem precisa ser o Catalyst, qualquer um serve pra<br>
isso. Depois você acompanha a execução dele passo a passo com o debugger<br>
ou até enchendo o código de print(), etc..<br>
<br>
--<br>
Eden Cardim<br>
Software Engineer<br>
<a href="http://bit.ly/edencardim" target="_blank">http://bit.ly/edencardim</a><br>
<a href="http://twitter.com/#!/edenc" target="_blank">http://twitter.com/#!/edenc</a><br>
<a href="tel:%2B55%2073%209986-3963" value="+557399863963" target="_blank">+55 73 9986-3963</a><br>
=begin disclaimer<br>
  Sao Paulo Perl Mongers: <a href="http://sao-paulo.pm.org/" target="_blank">http://sao-paulo.pm.org/</a><br>
 SaoPaulo-pm mailing list: <a href="mailto:SaoPaulo-pm@pm.org" target="_blank">SaoPaulo-pm@pm.org</a><br>
 L<<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/<u></u>listinfo/saopaulo-pm</a>><br>
=end disclaimer<br>
<br>
</blockquote>
=begin disclaimer<br>
  Sao Paulo Perl Mongers: <a href="http://sao-paulo.pm.org/" target="_blank">http://sao-paulo.pm.org/</a><br>
SaoPaulo-pm mailing list: <a href="mailto:SaoPaulo-pm@pm.org" target="_blank">SaoPaulo-pm@pm.org</a><br>
L<<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/<u></u>listinfo/saopaulo-pm</a>><br>
=end disclaimer <br>
=begin disclaimer<br>
  Sao Paulo Perl Mongers: <a href="http://sao-paulo.pm.org/" target="_blank">http://sao-paulo.pm.org/</a><br>
SaoPaulo-pm mailing list: <a href="mailto:SaoPaulo-pm@pm.org" target="_blank">SaoPaulo-pm@pm.org</a><br>
L<<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/<u></u>listinfo/saopaulo-pm</a>><br>
=end disclaimer<br>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div><font size="1" color="#333333">Saravá,</font></div><div><font size="1" color="#333333">Renato CRON Santos</font></div><div><div style="text-align:right">

<font size="1" color="#333333"><a href="http://www.renatocron.com/blog/" target="_blank">http://www.renatocron.com/blog/</a></font></div></div><div style="text-align:right"><font size="1" color="#333333"><a href="http://twitter.com/#!/renato_cron" target="_blank">@renato_cron</a><br>

</font></div><div style="text-align:right"><br></div><br>