-+  Associazione
-+  Documenti
 |-  Modern Perl
 |-  Bibliografia
 |-  Articoli
 |-  Talk
 |-  Perlfunc
 |-  F.A.Q.
 |-  F.A.Q. iclp
-+  Eventi
-+  Community
-+  Blog
-+  Link
Corso di Perl



 

Versione stampabile.

Enrico Sorcinelli

Concludiamo il nostro viaggio analizzando alcuni tra i più importanti e diffusi framework basati su mod_perl e Apache che ci aiuteranno nello sviluppo di complesse applicazioni web.
Parte V

Data di pubblicazione: Linux & C., anno 4, numero 26 (Luglio 2002).

©2003 Linux & C. Tutti i diritti riservati. E' vietata la copia e la riproduzione o ridistribuzione dell'articolo senza l'espresso permesso scritto dell'autore e dell'editore.

1. Introduzione 

2. HTML::Mason 

3. Apache::ASP 

4. HTML::Embperl 

5. Apache::AxKit 

6. Slash, OpenInteract & co. 

7. Success stories 

8. mod_perl 2: next generation 

9. Conclusione 

10. Risorse 

11. Convenzioni usate in questo articolo 

Introduzione

Concludiamo con questa puntata il nostro viaggio all'interno dell'universo Apache/mod_perl. Nelle precedenti puntate abbiamo visto passo passo come mod_perl, integrando un'interprete Perl direttamente nel web server Apache, ci consenta di realizzare applicazioni estremamente più veloci: infatti si elimina il sovraccarico associato all'avvio di un interprete Perl separato.

Inoltre mod_perl effettua il caching dei moduli e/o script eliminando la necessità di ricompilarli ad ogni richiesta.

Nondimeno mod_perl ci offre la possibilità di poter modificare in modo rapido il comportamento di Apache stesso usando la potenza e la flessibilità del Perl. Fra la lista impressionante di moduli mod_perl disponibili ci sono parecchi sistemi ad alto livello che uniscono i gruppi di moduli più piccoli in più grandi ambienti integrati.

In questa puntata analizzeremo alcuni tra i più importanti e diffusi framework basati su mod_perl e Apache che ci aiuteranno nello sviluppo di complesse applicazioni web.

 HTML::Mason

Fra i sistemi avanzati basati su mod_perl, HTML::Mason è sicuramente a mio avviso, il più flessibile. Nato un paio di anni fa come strumento di web publishing proprietario, è stato poi rilasciato sotto licenza opensource ed è nel tempo diventato stabile e maturo consentendo in maniera rapida e veloce la gestione di grossi siti con notevole quantità di contenuti dinamici.

L'idea di base di HTML::Mason è il componente: un componente è un mix di HTML e Perl e comandi HTML::Mason. Un componente in genere restituisce codice HTML ma può anche ritornare un valore. È possibile assemblare questi componenti in componenti più complessi. Infine è definito il componente top-level che rappresenta l'intera pagina web formata a sua volta da uno o più componenti. Questa architettura a componenti può essere vista come una rappresentazione orientata agli oggetti della propria web application e rappresenta un notevole vantaggio nella manutenzione ed aggiornamento del sito: ogni cambiamento ad un componente condiviso avrà immediatamente effetto su tutte le pagine che lo utilizzano.

La sintassi a componenti di HTML::Mason inoltre ben si presta a dividere presentazione e logica consentendo di utilizzare comodi sub componenti da inserire e utilizzare nelle pagine web. Il webmaster quindi non necessariamente deve avere una profonda conoscenza di programmazione e può concentrarsi sul layout della pagina HTML con il vantaggio di poter utilizzare il contenuto dinamico generato dai componenti. HTML::Mason è disponibile su CPAN e l'installazione non presenta particolari problemi. Una volta installato va attivato configurando Apache (in httpd.conf) con le seguenti direttive:

   PerlRequire /home/web/mod_perl/mason/handler.pl
   Alias /mason "/home/web/mod_perl/mason/www"

   <Location /mason>
      SetHandler perl-script
      PerlHandler HTML::Mason
   </Location>

Con tale configurazione lanciamo lo script Perl handler.pl (Esempio 1) per avviare e configurare HTML::Mason e con <Location> lo attiviamo per tutte le richieste ad URL che iniziano con /mason. comp_root rappresenta la directory dove andremo a salvare tutti i nostri componenti e deve essere la stessa di quella mappata con la direttiva Alias in httpd.conf.

Esempio 1. handler.pl, script di avvio di HTML::Mason

   #!/usr/bin/perl

   package HTML::Mason;

   # Usa il package Mason
   use HTML::Mason;
   use HTML::Mason::ApacheHandler (args_method=>'mod_perl');
   use strict;

   # Elenco di tutti moduli che verranno usati nei componenti
   {  
       package HTML::Mason::Commands;
       use DBI;
       use LWP;
   }

   # Crea gli oggetti Mason 
   my $parser = new HTML::Mason::Parser;
   my $interp = new HTML::Mason::Interp (
         parser => $parser,
         comp_root => '/home/web/mod_perl/mason/www',
         data_dir  => '/home/web/mod_perl/mason/data');
   my $ah = new HTML::Mason::ApacheHandler (interp => $interp);

   chown (Apache->server->uid, Apache->server->gid, $interp->files_written);

   sub handler {
      my ($r) = @_;
      my $status = $ah->handle_request($r);
      return $status;
   }

   1;
   __END__

Come esempio di funzionamento di HTML::Mason illustriamo la realizzazione di un semplice componente top-level (cioè una pagina web) che stampa le variabili di ambiente. È un esempio banale nel quale però abbiamo modo di soffermarci sulle principali caratteristiche di HTML::Mason (Esempio 2).

Esempio 2. env.html, semplice componente top-level HTML::Mason

   <%perl>
      my  @column_names = ("Chiave", "Valore");
   </%perl>

   <CENTER><H2><% $titolo %></H2>
   <TABLE WIDTH="90%" BORDER="0">
      <TR BGCOLOR="#CCCCCC">
         <TH><% $column_names[0] %></TH>
         <TH><% $column_names[1] %></TH>
      </TR>
   % foreach my $key ( sort keys %{$r->subprocess_env} ) {
      <TR <& .bgcolor &>>
         <TD><B><% $key %></B></TD>
         <TD><% $r->subprocess_env($key) %></TD>
      </TR>
   % }
   </TABLE><CENTER>
   <& footer.comp &>

   <%def .bgcolor>
   BGCOLOR="#<% $row_colors[$i] %>"\	
   % $i = !$i;
   </%def>

   <%init>
      my $titolo = "Variabili di ambiente";
      $i= 0;
   </%init>

   <%once>
      my $i;
      my @row_colors = ("FFFFFF","DDDDFF");
   </%once>

In un componente HTML::Mason possiamo inserire codice Perl all'interno delle apposite sezioni <%perl></%perl>. Inoltre ogni linea che inizia con '%' viene considerata come codice Perl. Infine tutto ciò che è compreso nei blocchi <% expr %> viene valutato come singola espressione Perl e sostituito con il risultato (tipicamente usato per la stampa delle variabili).

Il codice Perl può essere eseguito anche in altre due speciali sezioni <%init> e <%once>. La sezione <%init> contiene codice eseguito ogni volta non appena il componente viene chiamato e può essere utilizzata per operazioni appunto di inizializzazione del componente. La sezione <%once> consente invece di scrivere codice Perl che verrà eseguito solo la prima volta che il componente viene invocato.

All'interno di un componente è possibile richiamare un altro componente tramite la sintassi:

   <& component_path &>

Nel nostro esempio signature.comp è stato salvato nella stessa directory del componente top-level env.html e cioè /home/web/mod_perl/mason/www.

Esiste infine un componente speciale chiamato autohandler che, se presente nella directory, viene sempre invocato prima di ogni altro componente top-level.

Con il metodo $m->call_next passiamo poi il controllo al componente effettivamente richiesto (Esempio 4). Questo componente si rivela assai utile quando abbiamo la necessità di cambiare layout (ad esempio header e footer) in un grande numero di pagine in una stessa directory o vogliamo inizializzare particolari oggetti come la connessione ad un database o il ripristino di una sessione.

Esempio 3. footer.comp, semplice componente HTML::Mason

   <HR>
   <ADDRESS>
   Enrico for Linux&C - <% scalar localtime %>
   </ADDRESS>

Esempio 4. autohandler, lo speciale componente HTML::Mason

   <HTML>
   <HEAD>
      <TITLE>HTML::Mason test</TITLE>
   </HEAD>
   <BODY>
   <% $m->call_next %>
   </BODY>
   </HTML>

Lanciamo con nostro browser la URL http://localhost/mason/env.html e otterremo la videata di Figura 1. HTML::Mason è molto di più di quello esposto fino ad ora disponendo di tutte le funzionalità tipiche di un application server commerciale: dal caching dei componenti, all'ambiente di debugging, dal previewer integrato alla gestione delle sessioni. Inoltre la libreria dei componenti di HTML::Mason si arricchisce di giorno in giorno grazie al contributo dei numerosi adepti della comunità HTML::Mason. In definitiva possiamo a buon diritto considerare HTML::Mason alla stessa stregua di quello che Zope rappresenta per la comunità Python.

Figura 1. Output della pagina HTML::Mason env.html

Output della pagina HTML::Mason env.html

 Apache::ASP

Apache::ASP rappresenta un'implementazione della tecnologia Microsoft Active Server Pages che consente di utilizzare il Perl come linguaggio di scripting. Apache::ASP non è la sola soluzione ma è comunque l'unica opensource in quanto richiede Apache, Perl e mod_perl. Esistono infatti anche altre implementazioni commerciali come Sun Chili!Soft ASP, e ActiveState PerlScript che, pur essendo gratuito, richiede software commerciale per poter girare (IIS).

L'implementazione in Apache::ASP della stampa delle variabili di ambiente è assai semplice:

Esempio 5. env.asp, semplice pagina Apache::ASP

   <!--#include file="header.inc"-->
   <% 
      my @column_names = ("Chiave", "Valore"); 
      my @row_colors = ("FFFFFF","DDDDFF");
   %>
   <CENTER><H2><%= $titolo %></H2>
   <TABLE WIDTH="90%" BORDER="0">
      <TR BGCOLOR="#CCCCCC">
         <TH><%= $column_names[0] %></TH>
         <TH><%= $column_names[1] %></TH>
      </TR>
   <% 
      my %i =0;
      foreach my $key ( sort keys %{$Request->ServerVariables()} ) {
   %>
      <TR BGCOLOR="#<%= $row_colors[$i] %>">
         <TD><B><%= $key %></B></TD>
         <TD><%= $Request->ServerVariables($key) %></TD>
      </TR>
   <%
      $i = !$i;
   } 
   %>
   </TABLE><CENTER>
   <!--#include file="footer.inc"-->

In una pagina Apache::ASP, il codice Perl viene inserito all'interno di blocchi <% %>. Tutto ciò che è compreso nei blocchi <%= expr %> viene invece valutato come singola espressione Perl e sostituito con il risultato. Con le istruzioni:

   <!--#include file="nome_file"--> 

includiamo file esterni nei quali è ancora possibile scrivere codice Apache::ASP.

Esempio 6. header.inc

   <%
      use vars qw($titolo);
      $titolo = "Variabili di ambiente";
   %>
   <HTML>
   <HEAD>
      <TITLE>Apache::ASP</TITLE>
   </HEAD>
   <BODY>

Esempio 7. footer.inc

   <HR>
   <ADDRESS>
   Enrico for Linux&C - <%= scalar localtime %>
   </ADDRESS>
   </BODY>
   </HTML>

Per attivare Apache::ASP è necessario aggiungere almeno le seguenti direttive in httpd.conf:

   PerlModule  Apache::ASP
   Alias /asp "/home/web/mod_perl/asp"
   <Directory /home/web/mod_perl/asp >
      <Files ~ (\.asp)>
         PerlSetVar  StateDir /tmp/asp
         SetHandler perl-script
         PerlHandler Apache::ASP
      </Files>
   </Directory>

Salviamo i tre file in /home/web/mod_perl/asp e lanciamo con il browser la URL http://localhost/asp/env.asp: otterremo una pagina simile a quella di figura 1. Esula da questo articolo fare un corso di programmazione Apache::ASP, ma sicuramente la facilità di installazione e di sviluppo rende Apache::ASP un framework molto adatto per la veloce realizzazione di progetti di piccole e medie dimensioni. Apache::ASP non è solo un semplice porting della tecnologia ASP per cui oltre ad ereditarne tutte le caratteristiche (ad es. la gestione delle sessioni) ha anche altre importanti funzionalità quali il supporto XML e il rendering XSLT.

 HTML::Embperl

Della stessa famiglia di Apache::ASP appartiene anche HTML::Embperl che consente di inserire codice Perl all'interno di pagine HTML. Anche se questo modulo può funzionare in ambiente CGI tradizionale, è con mod_perl che esprime tutta la sua potenza. HTML::Embperl è particolarmente progettato per costruire pagine HTML e mette a disposizione particolari strumenti come il loop automatico di variabili in un contesto di tabella. Ad esempio il seguente codice stampa una tabella di tre righe contenenti A, B e C:

   <TABLE BORDER="1">
   [-
      my @cols_array = ("A","B","C"); 
   -]
      <TR>
         <TD>[+ $cols_array[$row] +]</TD>
      </TR>
   </TABLE>

La nuova versione (2.0), anche se ancora in beta, promette nuove ed interessanti funzionalità come il caching dell'output, la possibilità di estendere la sintassi, una gestione delle sessioni integrata, oltreché, essendo il motore completamente scritto in C, risulta molto performante.

 Apache::AxKit

Apache::AxKit è un XML Application Server per Apache scritto in mod_perl. L'analisi di questo complesso e potentissimo framework richiederebbe una serie di articoli a parte, molto più quindi di un semplice paragrafo. Cercheremo comunque in poche parole di trasmettervi l'idea di quello che può fare. Apache::AxKit consente la conversione, in tempo reale, da XML ai più svariati formati quali HTML, WML (WAP), realizzando di fatto il paradigma alla base della tecnologia XML: la separazione dei contenuti dalla presentazione.

Apache::AxKit utilizza l'eXtensible Stylesheet Language Transformations (XSLT) come linguaggio di trasformazione dei file XML negli altri formati. Tuttavia è presente anche un altro strumento, XPathScript, che combina le caratteristiche di XSLT e di XPath con la possiblità di inserire blocchi di codice Perl nella realizzazione degli stylesheet utilizzati dall'applicazione. Grazie ad una architettura a componenti ed alla API di Apache::AxKit è possibile scrivere codice facilmente riusabile. Nondimeno è da trascurare la funzionalità di caching che può essere completamente personalizzata definendo proprie politiche per la memorizzazione delle pagine già servite.

Se l'XML è la tecnologia con la quale avete a che fare allora Apache::AxKit è l'application server che cercate.

 Slash, OpenInteract & co.

Terminiamo questa breve carrellata accennando ad altri framework che ci mettono a disposizione complessi ambienti di sviluppo e di web publishing.

Il primo, come si evince dal nome, è il software utilizzato da http://slashdot.org, il celeberrimo portale di news alimentato dagli utenti stessi della rete. Il progetto, nato nel 1997, si è talmente evoluto e diffuso (sono tantissimi i siti che lo usano) che è stato pure oggetto di un libro O'Reilly ("Running Weblogs with Slash"). Oltre al pannello di controllo che permette di amministrare la maggior parte delle funzioni via Web, Slash ha una propria API, un sistema di template (basato su Template Toolkit) ed un'architettura modulare a plugin che consentono la personalizzazione del sistema e lo sviluppo di nuove funzionalità.

Figura 2. Home page del progetto Slash, http://www.slashcode.org

Slashcode home page

OpenInteract è un giovane ed innovativo application server opensource che, oltre alle funzioni di content management, offre un completo ambiente di sviluppo per complesse applicazioni web. Tutta la parte di gestione dei contenuti del sito viene fatta via web tramite un amichevole pannello di amministrazione che consente di definire nei minimi particolari tutte le componenti del sito anche da parte di chi non ha una preparazione necessariamente tecnica. Come supporto di memorizzazione (dati, templates, utenti, ecc) OpenInteract utilizza database relazionali e al momento solo MySQL e Sybase sono supportati. Come detto, il progetto è relativamente giovane, ha un'architettura modulare e dispone già di un discreto supporto della comunità caratteristiche che in definitiva lo rendono pari a software ben più blasonati quali PHPNuke.

Terminiamo il paragrafo accennando brevemente ad Apache::Template. Apache::Template è un modulo che fornisce l'interfaccia Apache/mod_perl al popolare sistema di templating Perl Template Toolkit. Gli utenti di Template Tolkit posso trarre vantaggio da questo modulo che consente ad Apache di servire direttamente pagine scritte in TT2.

 Success stories

Ci avviamo alla conclusione e non poteva mancare un paragrafo dedicato ad elencare brevemente alcuni tra i più importanti siti, chiamiamoli così 'di successo', che utilizzano l'accoppiata Apache/mod_perl.

http://www.macromedia.com: il nome dice tutto, la grande software house utilizza mod_perl per il proprio sito web.

Adobe (http://www.adobe.com) utilizza da anni Apache/mod_perl.

Di Slashdot (http://slashdot.org) ne abbiamo già parlato.

http://www.imdb.com: con i suoi 2 milioni di hits giornalieri, Internet Movie DataBase è il più completo sito al mondo dedicato al cinema.

Ricordiamo anche il sito della Ducati che utilizza HTML::Mason per la sua community (http://ducatiworld.ducati.com).

Recentemente Amazon ha annunciato il completo rifacimento del sito http://www.amazon.com utilizzando HTML::Mason.

http://www.redhat.com (Apache::ASP)

Ed in Italia? Molti dei canali del portale Libero sono realizzati utilizzando mod_perl: http://usenet.libero.it, http://shopping.libero.it, http://annunci.libero.it, http://business.libero.it.

 mod_perl 2: next generation

La versione stabile della serie 2.0 di Apache è stata rilasciata più di un anno fa. Numerose sono le nuove caratteristiche di Apache che hanno avuto impatto sulla revisione di mod_perl tra cui ricordiamo per importanza:

  • * Architettura Multi-Processing (MPM)
    La modalità con cui Apache gestisce le richieste viene delegata a moduli

    appositi: una conseguenza di questo è il supporto nativo al multithreading (moduli threaded/os2/winnt/beos). Naturalmente esiste ancora il modulo 'prefork' che emula il modello multi-processo della serie 1.3.x

  • * APR (Apache Portable Runtime)
    La potente API di Apache può essere ora usata anche al di fuori del web server

    Apache.

  • * Supporto muliti-protocollo
    È possibile estendere Apache con plugin per la gestione di protocolli diversi

    dall'HTTP. Ad esempio potremmo sfruttare l'infrastruttura Apache per realizzare un server FTP o un mail server (SMTP), o un server che utilizzi un protocollo da noi inventato!

Il progetto mod_perl 2 nasce quindi dall'esigenza di adattarsi alla nuova architettura e API di Apache ed è una completa riscrittura di mod_perl 1.x, i cui sorgenti, nei suoi sei anni di vita, sono stati sempre brillantemente adattati ai vari cambiamenti di Apache e Perl.

Una delle nuove caratteristiche più interessanti di mod_perl è indubbiamente la possibilità di beneficiare del nuovo modello multithreading di Apache: in tale modalità mod_perl istanzia un pool di interpreti Perl che mette a disposizione di tutti i thread Apache riducendo drasticamente l'uso di memoria. Come semplice conseguenza di questa architettura vi è la possibilità di realizzare ad esempio un pool di connessioni ad un database.

mod_perl 2 (ora siamo alla 1.99_12) è da considerarsi 'beta' quando usato con il modello MPM prefork e 'alhpa' quando usato con il modello MPM threaded (ed è richiesto Perl 5.8.0 o superiore). Tuttavia, se utilizzato con il modello MPM prefork, mod_perl 2 è praticamente 'stable': quindi il suo utilizzo va ben oltre il provarlo solo nel vostro PC almeno per iniziare a prendere la mano con la nuova API, ma può essere già usato in produzione.

 Conclusione

Ho avuto in passato l'occasione di valutare praticamente ogni ambiente di sviluppo Web disponibile e mod_perl è sicuramente in una posizione di eccellenza per quanto, riguarda scalabilità e supporto della comunità.

E soprattutto, ricordiamoci, mod_perl è un progetto opensource: nel mondo di mod_perl e dell'opensource in generale abbiamo a disposizione numerosi sistemi avanzati, ciascuno destinato a soddisfare differente scopi, estendibile ed aperto quanto mod_perl stesso. Abbiamo infatti visto che se si desidera costruire siti a partire da gruppi di più piccoli componenti dinamici, HTML::Mason fa al caso nostro. Se si preferisce includere codice Perl direttamente nelle pagine HTML allora ecco Apache::ASP oppure HTML::Embperl. Se c'è bisogno infine di application server XML si può usare Apache::AxKit.

In questa serie di articoli abbiamo illustrato le principali caratteristiche di mod_perl. Ma il modo migliore per apprezzare le sue enormi potenzialità è provare direttamente ad usare mod_perl! Troverete come mod_perl sia la scelta migliore per lo sviluppo di veloci ed altamente performanti applicazioni Web!

 Risorse

 Convenzioni usate in questo articolo

Le seguenti convenzioni tipografiche sono stato utilizzate in questo articolo:

Corsivo

Utilizzato nelle URL, nei percorsi di file, nelle pagine di manuale, nei titoli di libri e/o articoli. Anche nuovi termini cui si intende dare particolare rilievo sono formattati in corsivo.

Larghezza costante

Utilizzato negli esempi di codice e file di configurazione, nel codice che appare all'interno del testo e negli esempi che illustrano cosa digitare a linea di comando.

Negli articoli ci sono molti esempi di codice Perl: alcuni sono solamente pezzi di codice, altri invece programmi completi che possono essere individuati poiché iniziano tutti con la linea #! (shebang):

   #!/usr/bin/perl

Tutti gli esempi che illustrano procedure a linea di comando usano %> per indicare il generico prompt della shell:

   %> perl -e 'print "Hello world\n"'
      Hello word

Occasionalmente viene utilizzato #> per indicare espressamente la shell dell'utente root:

   #> perl -e 'print "Hello world\n"'
      Hello word

D:
Progetti e documenti in rilievo
Corso di Perl Progetto pod2it
D:
La ML di Perl.it
mongers@perl.it è la lista ufficiale di Perl Mongers Italia per porre quesiti di tipo tecnico, per rimanere aggiornato su meeting, incontri, manifestazioni e novità su Perl.it.
Iscriviti!
D:
Annunci Google