Newsgroup: it.comp.lang.perl
Titolo: R: In linea

 modo da togliere la riga dal file di testo)
Partendo dal presupposto che per te 'essere in linea o meno' significa
(immagino)
avere il browser aperto su una determinata pagina (chiamiamola per comodita'
http://www.miosito.it/checkme
 ) io farei cosi', evitando anche di dover
usare i cookies:
1- si fa in modo che se il cgi viene richiamato nudo e crudo (cioe' con
l'url che ho
    scritto sopra) questo generi una codice utente random da appendere
all'url e si limiti
    a richiamare se stesso con il codice utente in coda, cosi':
        <code>
            if (!$ENV{'PATH_INFO'} of $ENV{'PATH_INFO'} eq '/') {
                $codiceutente = qualunquecosa();
                $oldurl = "http://" . $ENV{'HTTP_HOST'};
                print "Location: http://$oldurl/$random\n\n";
            }
        </code>
2- Se invece il cgi viene chiamato con la coda (il path_info) allora si
provvede a:
    2.1- creare/aggiornare un file di log dell'utente con l'ora di refresh
della
            pagina:
                <code>
                    if (!-f $codiceutente) {
                        open LOG,">$codiceutente";
                        print LOG idatidellutente();
                        close LOG;
                    }
                    $now = time;
                    utime now,now,$codiceutente;
            </code>
    2.2- generare la pagina html, all'interno della quale saranno (suppongo)
elencati gli utenti
            online (ove per tali si intendono gli utenti che hanno
aggiornato il proprio file di log non
            meno di tot secondi fa) e contenente nell'header il tag meta:
            <meta http-equiv=Refresh content=totsecondi>
Il tag meta di cui sopra garantisce che la pagina venga ricaricata (e quindi
lo stato di
connessione aggiornato) ogni totsecondi.
Il logfile dell'utente puo' contenere sia dati di registrazione (o di
classificazione) relativi all'utente
stesso, sia opzioni di sessione da lui stesso modificabili.
Ovviamente bisognerebbe prevedere anche un qualche meccanismo che, con una
certa calma,
provveda a cancellare i logfiles relativi agli utenti non piu' connessi.
Questo metodo ha anche il vantaggio che se un utente si disconnette, ma dopo
un po' si ripresenta
con lo stesso url (lo stesso codiceutente), il suo stato di connessione
viene riattivato.
Non ci dovrebbe essere nemmeno il problema del lock/unlock dei files,
perche' ogni utente ha un file
di log separato, e l'accesso in scrittura ce l'ha solo lui.
Se poi l'area di accesso e' un'area riservata (con accesso
username/password), allora non c'e'
nemmeno bisogno del trucco della generazione del codice casuale per
l'identificazione dell'utente.
In questo caso l'utente viene identificato tramite la variabile
$ENV{'REMOTE_USER'} e il logfile
stesso puo' essere semplicemente un file che non muore mai, contenente i
parametri di configurazione
dell'utente e il cui access time viene aggiornato ad ogni refresh della
pagina.
ciao, marco
--
Marco Cacchiani                                
e-mail:ma...@sirius.pisa.it
Public pgp key:         
http://www.sirius.pisa.it/marco/pgp_public_key.asc
Sirius Servizi Informatici                     e-mail: 
in...@sirius.pisa.it
Parco Teatro Pasolini, 1                       Phone:  +39 (50) 865120
I-56019 - Vecchiano                            Fax:    +39 (50) 860260
(Pisa - ITALIA)                                
http://www.sirius.pisa.it/

 wrote in message
96093785...@vega.sirius.pisa.it...


 Capito qual'č il problema!?!
Io il pbl l'ho capito. La soluzione sta appunto nel fatto che il client
dell'utente richiama periodicamente un url che aggiorna il proprio stato di
connessione (cioe' nel file degli utenti loggati aggiorna se stesso con
l'istante in cui viene tichiamato il cgi).
Se l'utente usa un browser normale questo puo' essere ottenuto con il meta
tag <meta http-equiv=Refresh content=totsecondi>, che ricarica la pagina con
gli utenti in linea (eventualmente l'utente puo' vedere una pagina con dei
frames, di cui uno dedicato all'elenco degli utenti in linea: e' questa la
pagina che va ricaricata e il cui cgi aggiorna lo stato di connessione
dell'utente ... se ci pensi, poi, e' ovvio che in un attrezzo come quello
che vuoi fare tu ci sia una pagina che viene ricaricata a intervalli, senno'
come fa uno a vedere via via chi si connette/disconnette?)
Se invece l'utente usa un browser fatto ad hoc ancora meglio perche' le
chiamate http e la loro temporizzazione le gestisci tu dal tuo programma,
senza bisogno di ricorrere al reload della pagina fatto con il meta tag.
Di fatto, poi, che tu l'aggiornamento dello stato di connessione dell'utente
lo faccia con 'utime' sul file identificativo dell'utente, oppure
aggiornando una riga in un file di testo, oppure ancora aggiornando il
valore di un campo in un db (magari aperto con una sessione persistente) e'
solo un dettaglio implementativo. Il nocciolo sta nel fatto che se l'ultimo
aggiornamento dello stato di connessione dell'utente e' piu' vecchio di un
tot l'utente viene considerato disconnesso.
Occhio pero' che se metti tutti gli utenti in un file sei costretto ad
aprire/chiudere/modificare lo stesso file per tutti, con prevedibili
problemi di conflitti per accesso simultaneo, mentre se fai un file per ogni
utente questo problema non ce l'hai (anche se in caso di molti utenti
connessi puoi avere problemi di efficienza).
