Newsgroup: it.comp.lang.perl
Titolo: cgi.suspended

Gentilissimi.
Mi rivolgo a Voi per vedere di risolvere 2 problemi con un script
scaricato dal Cgi-resource relativo ad un GuestBook.
Sono riuscito ad apportare alcune modifiche a questo script, modifiche
di poco conto riguardanti il gruppo data-ora ed al layout della pagina
guestbook.html.
Il primo problema  è il  seguente:
Come posso fare perchè ogni "messaggio" venga numerato automaticamente
dallo script.
Qualcuno e in grado di fornirni il codice o, quanto meno delle linee
guida che possano aiutarmi in questo senso?
Il secondo, invece riguarda la capicità dello script di "sopportare"
più presenze contemporanee.
In verità, non so se questo è un limite dello script o un limite del
server che lo ospita.
Mi spiego:
Se gli ospiti firmano il libro "singolarmente", a distanza (nel tempo)
uno dall'altro, tutto funziona  perfettamente. Se, invece, due o più
ospiti firmano il libro contemporaneamente, dopo un po' di tempo, lo
script guestbook.cgi si blocca mandando un inequivocabile "page not
found - error 404", perchè il file guestbook.cgi  è diventato
guestbook.cgi.suspended.
C'è qualcuno che sa spiegarmi perchè questo avviene?
Io, da profano quale sono, credo di poter dire che siano dei problemi
risolvibili facilmente da chi il Perl lo mastica più di quanto non lo
mastichi io, considerato che ho iniziato ad averci a che fare solo da
pochi giorni.
Ringrazio (di più non posso fare) quanti vorranno provare a risolvere
il caso.
Un cordiale saluto a tutto il NG.
Armando
Sent via Deja.com 
http://www.deja.com/
Before you buy.

 
Il server http solitamente e' in grado di servire piu' richieste
contemporaneamente. Quindi puo' accadere che siano in esecuzione
contemporaneamente piu' processi che eseguono un dato script cgi
(generalmente in fasi diverse dell'esecuzione, dato che le richieste
arrivano in modo casuale). Tutti gli script CGI devono  essere programmati
in modo da tenere conto di questo fatto. Anche nei casi semplici in cui il
contesto dello script e' "privo di stato" (ovvero ogni run e' indipendente
dall'altro) possono sorgere conflitti (ad esempio se lo script apre un
file temporaneo con nome fisso, due versioni dello script non possobno
girare contemporameamente).
Nel tuo caso il contesto ha invece uno stato (ovvero ogni run dello script
dipende da quelli precedenti perche' ogni nuovo guest deve andare in coda
a quelli che lo hanno preceduto). Se il codoce dello script non prevede
una sorta di "semaforo" o almeno un "lock file" vuol dire che e' sbagliato
(o quanto meno troppo semplice) e non puo' funzionare bene.
I due problemi che poni sono aspetti dello stesso problema:
problema 2) Ogni istanza dello script deve verificare che non ci sia
            un'altra istanza che sta "occupando" il file "guestbook".
problema 1) Ogni istanza dello script deve incrementare un contatore
Ecco un esempio di script che risolve entrambi i problemi:
#========================================================
#!/usr/local/bin/perl
$|=1;
# NOTA: LockFile deve essere gia' esistente. All'inizio puo' contenere il
#       numero 0.
for(;;) {                               # Aspetta che LockFile sia libero
        if(open(LOCKFILE,"+<LockFile")) { last; } 
        sleep(1);                       # riprovando una volta al secondo
}
$Naccess=<LOCKFILE>;                    # Legge il contatore
print "Il processo $$ si e' preso il lockfile. Contatore=$Naccess\n";
$Naccess++;                             # incrementa il contatore
seek(LOCKFILE, 0, 0);                   # Posiziona file pointer a inizio
print LOCKFILE $Naccess ;               # scrive nuovo valore del contatore
# Qui si mettono le altre operazioni che devono essere fatte una alla volta
# ad esempio si aggiorna il file del guestbook. Io ho messo la sleep()
# per verificare il funzionamento
sleep(10);
close LOCKFILE;                         # Libera il lock file
#=======================================================
Ecco cosa succede se lo si esegue piu' volte contemporaneamente:
lfini-lfini-146:
lockfile.pl
 ; 
lockfile.pl
 ; 
lockfile.pl
 ; 
lockfile.pl
Il processo 7656 si e' preso il lockfile. Contatore=
Il processo 7658 si e' preso il lockfile. Contatore=1
Il processo 7666 si e' preso il lockfile. Contatore=2
Il processo 7672 si e' preso il lockfile. Contatore=3
(fra ogni linea di output passano, ovviamente, circa 10 secondi).
Buon lavoro,
						l.f.
--------------------------------------------------------------------------
       -- )     Luca Fini                            Tel: +39 055 2752 307
 ___    |\      Osservatorio Astrofisico di Arcetri  Fax: +39 055 2752 292
/   |   | |-_   L.go E.Fermi, 5 +-----------------------------------------
(___|___//___)  50125 Firenze  /   WWW: 
http://www.arcetri.astro.it/~lfini
 (_)      (_)   Italia        / e-mail: 
lf...@arcetri.astro.it
-----------------------------+--------------------------------------------
                              In a world without fences - who needs GATES?