mod_perl

É uma forma de rodar o seu código diretamente no processo do apache. É
mais rápido que o FastCGI (acho até que é o mais rápido, mas nao
conferi) e tem uma boa gama de problemas. É uma das "gambiarras" mais
usadas pra melhorar performace de CGI. É semelhante ao que o PHP faz.

Blabos, poderia falar mais sobre "tem uma boa gama de problemas" ?!?

Obrigado ..




Eduardo Almeida - Engenharia de Software
[email protected] - 27 3021-1530 / 27 9600-0395

WEB2 Solutions - Inovando, sempre!
-----Original Message----- From: Blabos de Blebe
Sent: Monday, October 24, 2011 11:18 AM
To: [email protected]
Subject: Re: [SP-pm] Como fazer?

Ok, vejamos se eu consigo complementar o que o Eden disse...

Vou partir do princípio que você está querendo descobrir qual a
pergunta, porque era assim que eu estava quando fazia as suas
perguntas.

Vou usar de licença poética, vulgo, dados incompletos ou exagerados em
algum ponto.

Reset geral...

HTTP

Primeiramente, HTTP é um protocolo, ou seja é um acordo feito entre as
duas partes, cliente e servidor, sobre como conversar. É como se eu
chegasse pra alguém na rua e dissesse:

_Oi, fala português?
_Sim, falo.
_Então vamos bater um papo.
...

Eu, pessoalmente acho o HTTP robusto demais pra ficar obsoleto em
breve, pois ele ainda é sub-sub-utilizado. Talvez um HTTP 1.2 ou 2.0.

Você pode dar uma olhada em:
https://github.com/blabos/Docs/wiki/Protocolo-HTTP

Servidor Web

Um servidor web (vou usar esse termo com licença poética) é uma
aplicação que ao subir, fica escutando em uma porta específica. Ao
receber uma requisição de um cliente, ele escolhe uma estratégia pra
tratá-la, e responde de acordo, no caso, de acordo com o que ele
quiser responder, mas é comum seguir algum padrão.

CGI, cgi e CGI.pm

CGI, Common Gateway Interface, é um padrão de interface. Entre quem?
Entre o servidor web e a sua aplicação.

Se sua aplicação segue o padrão cgi, não importa em que linguagem, ela é um cgi.

Ex:

#include <stdio.h>

int main(void) {
   printf("Content-Type: text/html\n\n");
}

Pronto, uma aplicação cgi em C. Faça o teste.

CGI.pm é um framework em Perl que te fornece diversas facilidades para
trabalhar dentro do padrão CGI. As que eu mais gosto são a CGI::param
e a CGI::cookie. Dá pra brincar muito só com isso.


A principal característica do CGI é que toda vez que o cliente pedir
ao servidor para executar um cgi, ou seja a cada refresh do browser, o
servidor precisa fazer um fork, seguido de exec e isso é inerentemente
lento. Por quê? Dever de casa.

http://www.cs.vu.nl/~ast/



FastCGI e FCGI

O FastCGI é um novo padrão de conversa entre servidor e aplicação.
Basicamente ele diz que ao invés de abrir um novo processo, o servidor
deve manter um processo rodando e aproveitá-lo entre as requisições.

É mais rápido que o CGI.


mod_perl

É uma forma de rodar o seu código diretamente no processo do apache. É
mais rápido que o FastCGI (acho até que é o mais rápido, mas nao
conferi) e tem uma boa gama de problemas. É uma das "gambiarras" mais
usadas pra melhorar performace de CGI. É semelhante ao que o PHP faz.


Catalyst, Mojlicious e Dancer

São frameworks para construção de aplicações MVC, cada um com suas
peculiaridades. Já implementam as interfaces padrão com o servidor,
deixando pra você se preocupar somente com a sua aplicação, que cada
um vai dar o seus pulos pra conversar com o servidor sem te importunar
muito com esses detalhes.

Ou seja, não se preocupe com configurações e concentre-se na sua aplicação.


Cookie

O Cookie é uma sacada genial, que possui seus problemas, mas permite
ao HTTP, que é um protocolo state-less, emular uma máquina de estados,
vulgo sessão.


Recapitulando:

Host Cliente <-- ( TCP/IP ) --> Host Servidor

Aplicação Cliente <--( HTTP ) --> Aplicação Servidor

Servidor Web <--( CGI/FastCGI/PSGI/WSGI ) -> Aplicação Web

Note as várias camadas. O Eden deu um ótimo curso sobre isso na FEI.
Se ele repetir em janeiro, eu recomendo.


...

Esses conceitos são super simples, mas fundamentais pra começar a
fazer as perguntas certas. O problema é que esses cursos web de banca
de jornal passam por cima e ensinam a trabalhar somente com um cenário
bem específico.

Não fosse assim talvez os buzzwords soap, wsdl, webservice e muitos
outros poderiam ter sido simplesmente mais uma aplicação restfull...

Qualquer dúvida, google, depois pergunta :)


[]'s


2011/10/24 Eden Cardim <[email protected]>:
"Rafael" == Rafael Silveira <[email protected]> writes:

   Rafael> Boa noite galera, tentarei ser direto!
   Rafael> Tenho o código a seguir

   Rafael> package MyApp::HomeController;

   Rafael> use base qw{Controller};

   Rafael> sub new {
   Rafael> }

   Rafael> sub index {
   Rafael>    ...
   Rafael> }

   Rafael> 1;

   Rafael> Qual a melhor forma de criar um server http, para qndo eu
   Rafael> acessar localhost/Home/index do meu browser eu obter o
   Rafael> retorno do metodo index?

Sendo direto, não dá pra explicar a melhor forma dentro de um email. É
igual perguntar a melhor forma de implementar um sistema operacional. A
sua pergunta é difícil e a resposta, por consequência, vai ser
difícil. Mas, assumindo que uma forma "não-melhor" é tolerável, aqui
vai:

--8<---------------cut here---------------start------------->8---
package MyApp;
use warnings;
use strict;
use IO::Socket;
use Net::hostent;    # for OO version of gethostbyaddr

my $PORT = 9000;

sub run {
   my ($class) = @_;
   my $server = IO::Socket::INET->new(
       Proto     => 'tcp',
       LocalPort => $PORT,
       Listen    => SOMAXCONN,
       Reuse     => 1
   );

   die "can't setup server" unless $server;

   printf STDERR "[Server $0 accepting clients]\n";

   while ( my $client = $server->accept() ) {
       my $hostinfo = gethostbyaddr( $client->peeraddr );
       printf STDERR "[Connect from %s]\n",
         $hostinfo ? $hostinfo->name : $client->peerhost;

       my ( $method, $req_uri, $http_ver ) = split ' ', scalar <$client>;
       my $c_method = $class->uri_to_method($req_uri);
       print $client "$http_ver 200 OK\n";
       print $client "Content-type: text/plain\n\n";
       print $client MyApp::Controller->$c_method($client);
       print $client "\n";
   }
}

sub uri_to_method {
   my ( $class, $uri ) = @_;
   $uri =~ s{/+}{_}g;
   $uri .= 'index' if $uri eq '_';
   return $uri;
}

package MyApp::Controller;
use warnings;
use strict;

sub _index { 'Hi, you hit the index' }

sub _foo { 'Whoa, you hit foo' }

sub _bar { 'Hey there, you hit bar' }

sub AUTOLOAD { 'not found' }

package main;

MyApp->run;
--8<---------------cut here---------------end--------------->8---

Coloca isso num arquivo e roda, depois abre http://localhost:9000 no
browser. Isso é uma implementação porta e grosseira extraída de perldoc
perlipc que basicamente faz 80% do que os servers como o apache, nginx,
HTTP::Server, Starman fazem. A "melhor forma" você vai encontrar olhando
pro source de cada uma dessas implementações. Os outros 20% você termina
em alguns anos, até lá, o HTTP provavelmente já estará caminhando para a
obsolescência. De qualquer forma, a especificação se encontra em
http://www.w3.org/Protocols/rfc2616/rfc2616.html, boa sorte!

   Rafael> Desculpe de novo, essa "mesma" pergunta, só que dessa vez
   Rafael> quero exemplificar dessa forma!

   Rafael> Nao sei qual lib usar para o HTTP, talvez um CGI::Fast ou
   Rafael> qlqr outra lib!

Porque você quer usar essas libs mas não quer usar as que já fazem algo
mais próximo do que você quer? Onde é o seu critério de corte? E porque
você está na dúvida se usa HTTP ou CGI, você realmente sabe o que eles
fazem e a relação entre os dois?

   Rafael> Mas por gentileza, gostaria de saber dessa forma!

   Rafael> Como vocês sabem estou aprendendo perl, ja me deram as dicas
   Rafael> para aprender Catalyst, mas antes, gostaria de descobrir
   Rafael> como fazer isso!

   Rafael> Desde já agradeço!

Repetindo, se você olhar no fonte do Catalyst, vai encontrar uma
implementação similar e muito melhor do que essa colada acima. Mas pra
você entender o fonte, precisa entender o que ele está se propondo a
fazer. De novo, eu sugiro que você aprenda a implementar algo bem básico
usando um framework, nem precisa ser o Catalyst, qualquer um serve pra
isso. Depois você acompanha a execução dele passo a passo com o debugger
ou até enchendo o código de print(), etc..

--
Eden Cardim
Software Engineer
http://bit.ly/edencardim
http://twitter.com/#!/edenc
+55 73 9986-3963
=begin disclaimer
  Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
 SaoPaulo-pm mailing list: [email protected]
 L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
=end disclaimer

=begin disclaimer
  Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
SaoPaulo-pm mailing list: [email protected]
L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
=end disclaimer
=begin disclaimer
  Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
SaoPaulo-pm mailing list: [email protected]
L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
=end disclaimer

Responder a