• Publicidad

mod_perl

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

mod_perl

Notapor chavelito » 2009-05-31 00:27 @060

Hola a todos.

Ya hice algunos post más antes y en base a ellos desarrollé mi primer script en Perl. Funciona muy bien, pero no me dio los resultados que esperaba ya que en PHP se ejecutaba más rápido y utilizaba menos recursos.

Bueno, esto no me desanima, ya que me explicaron que Perl funciona mucho más rápido con mod_perl. Mi pregunta es ¿EL MOD_PERL USA OTRA SINTAXIS? ¿DEBO MODIFICAR EL CÓDIGO YA HECHO O SOLO NECESITO CARGARLO EN UN "use"? ¿En cuál gasto más memoria? ¿CPU PERL+CGI, PERL+MOD_PERL O PHP? ¿Alguien me podría explicar? Dejaré un ejemplo de mi código.

Espero esté bien formulada la pregunta, ¡muchas gracias!

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -w
# Cargando Módulos necesarios
use CGI ':standard';
use CGI::Carp qw(fatalsToBrowser);
use Mysql;
use LWP::UserAgent;
use HTTP::Request;
use warnings;

# Creando Variables nesesarias
my $cgi = CGI->new();
my %_GET = $cgi->Vars();

# Cargando el config e imprimiendo las cabeceras
push (@INC, '.');
require 'config.pl';
print $cgi->header(-charset => 'iso-8859-1');
# Verificando si nuestro GET tiene el valor correcto Grupo - Tema
my $data = $_GET{id};
@datos = split(/ - /, $data);
if (defined($datos[1]) && defined($datos[0]))
{
# Conectando a la BD de lyrics y ejecutando consultas
conectar (nuevaq_lyrics);
my $tema = $db->quote($_GET{id});
my $consulta = "SELECT titulo,letra FROM lyrics WHERE titulo=$tema";
my $query = $db->query($consulta) or die $Mysql::db_errstr;
# creando condicional de resultados
if($query->numrows)     {
        my %datos = $query->fetchhash;
        my $letra = utf8::decode($datos{'letra'});
# Imprimiendo las letras
                print " <div id=\"new-videos-module\" class=\"side-module\">
                            <div class=\"head\"><h2>Letra de Cancion</h2></div>
                            <div class=\"body\">
                            <div id=\"side_new_video_tab\" class=\"section\">
                            <div id=\"xNav\">
                                <p class=\"title\">$datos{'titulo'}</p>
                                <p>$datos{'letra'}</p>
                            </div>
                            </div>
                            </div>
                            <div class=\"foot\"></div>
                            </div>"
;
        }
else {
        # En caso que las lyrics no existan en nuestra DB ejecutamos el explorador
        # Asignando variables
        my $URL = 'http://www.lyricsplugin.com/winamp03/plugin/?title='.$_GET{id};
        my $agent = LWP::UserAgent->new(env_proxy => 1,keep_alive => 1, timeout => 30);
        my $header = HTTP::Request->new(GET => $URL);
        my $request = HTTP::Request->new('GET', $URL, $header);
        my $response = $agent->request($request);
        # Condionales de resultado
                if ($response->is_success){
                my $datoz = $response->as_string;
                my ($temx,$artista,$letra) = $datoz =~ m/<div id="title">(.*?)<\/div>.*?<div id="artist">(.*?)<\/div>.*?<div id="lyrics">(.*?)<\/div>/sm;
                print " <div id=\"new-videos-module\" class=\"side-module\">
                            <div class=\"head\"><h2>Letra de Cancion</h2></div>
                            <div class=\"body\">
                            <div id=\"side_new_video_tab\" class=\"section\">
                            <div id=\"xNav\">
                                <p class=\"title\">$artista - $temx</p>
                                <p>$letra</p>
                            </div>
                            </div>
                            </div>
                            <div class=\"foot\"></div>
                            </div>"
;
                my $insertar = "INSERT INTO lyrics (titulo,letra) VALUES ($tema,'$letra')";
                $db->query($insertar) or die $Mysql::db_errstr;
                }
                elsif ($response->is_error){
                print "Error:$URL\n";
                print $response->error_as_HTML;
                }
        }
}
# Cerrando Script
exit (0);
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


Gracias
chavelito
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2009-05-20 17:09 @756

Publicidad

Notapor explorer » 2009-06-04 18:05 @795

mod_perl es un intérprete de Perl que corre embebido dentro del servidor web Apache.

Cuando mod_perl necesita ejecutar un programa Perl, primero mira a ver si lo tiene ya leído. Si no es así, lo lee e interpreta. Si lo tiene leído, lo ejecuta y lo almacena en memoria.

Esto quiere decir que hay que tener un cierto cuidado a la hora de hacer los programas orientados a mod_perl: como los programas no terminan, es como si estuvieran en un bucle sin fin... y de ahí puede ocurrir que al reiniciar el programa, las variables globales que estuviéramos usando, en vez de empezar con valores supuestos 0, mantendrían los valores de la última ejecución anterior. Esto puede provocar errores de funcionamiento. Por eso es siempre recomendable usar variables locales en nuestros programas.

Luego está la parte de la instalación de los programas para que los ejecute mod_perl.

Hacer que un programa Perl sea ejecutado por mod_perl se puede hacer de varias formas. Aquí supondremos que estamos hablando de la versión v2 de mod_perl.

En el documento Getting Your Feet Wet with mod_perl se detalla el proceso para configurar Apache para empezar a trabajar con mod_perl (para los inquietos).

El primer método es usando el módulo ModPerl::Registry. Dentro de Apache ponemos:
Código: Seleccionar todo
  Alias /perl/ /home/httpd/httpd-2.0/perl/
  <Location /perl/>
      SetHandler perl-script
      PerlResponseHandler ModPerl::Registry
      PerlOptions +ParseHeaders
      Options +ExecCGI
      Order allow,deny
      Allow from all
  </Location>

El módulo ModPerl::Registry permite ejecutar los programas CGI de toda la vida, pero en un entorno mod_perl controlado (ModPerl::Registry es la versión moderna del módulo Apache::Registry del mod_perl v1).

En ese trozo de configuración estamos indicando que el directorio virtual /perl servirá para ejecutar los programas Perl a través de ModPerl::Registry. Podremos copiar allí los CGI residentes en (generalmente) /usr/lib/cgi-bin e invocarlos, en vez de http://servidor/cgi-bin/programa.pl, como http://servidor/perl/programa.pl.

ModPerl::Registry, para imitar en lo más posible al modo de trabajar con los CGI, antes de volver a ejecutar la copia del programa que mantiene en memoria, mira a ver la fecha del programa guardado en disco. Si es más moderna esa versión que la copia que mantiene en memoria, lo descarta y lo vuelve a leer e interpretar. De esta manera, podemos desarrollar de forma rápida los programas bajo mod_perl. Al menos de forma tan rápida como si fueran CGI.

La diferencia en prestaciones de usar mod_perl a usar CGI, es que:
1.- El servidor web no necesita arrancar un intérprete Perl en cada invocación del usuario
2.- Nos ahorramos el tiempo de interpretación de nuestro programa, porque solo se hace una vez, al principio.

De aquí vienen las mejoras en cuanto a aumento de la velocidad, porque nos ahorramos varios pasos iniciales. No ahorramos tiempo en ejecución, porque el programa funcionará a la misma velocidad que antes.

Estas mejoras son a costa de reservar memoria, naturalmente. Pero hoy en día, es un recurso barato.

Muchos programadores no pasan de este nivel de uso de mod_perl, por ser rápido y limpio. Y porque pasar al siguiente nivel implica leer y aprender mucho, sobre todo en el modo en que Apache trabaja.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados