Newsgroup: it.comp.www.php
Titolo: uccidere le sessioni

Problemino...
Apro una sessione quando apro una popup, ma la devo chiudere quando
l'utente chiude il popup.
Il progetto è una chat e lavoro con le sessioni, senza cookie, e devo
scrivere il nome dell'utente appena entra in chat e farlo scomparire
appena esce. Per intercettare il login dell'utente ovviamente non ci
sono problemi (scrivo i dati in un db), ma per intercettare la sua
uscita...eh, quà sta il problema. Dovrei andare a cancellare il record
inserito durante il login. Ho provato a ricaricare la stessa pagina
con un parametro che indica di eseguire una function che fa il delete,
ma non funza. La chiusura della popup la intercetto con javascript, ma
da li mi fermo.
Qualcuno ha un'idea stimolante?
 ------------------------------------
 Il peccato di Caino
 La seduzione del male
 
www.vampiripavia.com
-------------------------------------
                *IcarusDream*
  -Dove un sogno è ancora libero-

 Qualcuno ha un'idea stimolante?
In realta' non puoi mai essere 100% sicuro. L'unica cosa che potresti fare
di usare i metodi che hai gia', magari aggiungere qualche reload della
pagina (javascript timeout) per segnare che sia ancora attivo ed aggiungere
un timeout nel tuo db (che controlla ognitanto chi potrebbe essere inattivo
in base ad un timestamp).

in base ad un timestamp).
Non ho compreso appieno quello che volevi dire, forse per il tuo
italiano traballante :)
Ho trovato comunque un escamotage.
Usando onUnLoad nel body della finestra che deve registrare l'uscita
dell'utente, si apre una popup alle coordinate 10000,10000 che si
chiude da sola dopo 10 millisecondi e che esegue le funzioni php di
cancellazione utente dal db.
Non è elegante, anche perchè si vede una finestra che si apre e si
chiude, nella barra di stato di windows, ma è l'unico modo che mi è
venuto in mente.


 venuto in mente.
Non si riesci a determinare 100 % se qualcuno fa un logoff decente, ma puoi
analizzare se una persona ha fatto un refresh di una pagina. Se sforzi il
refresh (anche solo un frame) con il settimeout del javascript(che carica
una pagina php) puoi controllare se qualcuno ha ancora la tua pagina nel
browser (finche' abilitato il javascript). Se l'utente non ha fatto un
refresh nei ultimi 10-60 minuti presumi che sia andato off line.
+ chiaro? (scusa l'italiano, non e' la mia madrelingua, ma il concetto
dovrebbe esserci :) ).

dovrebbe esserci :) ).
Si , chiaro :)
Il refresh è automatico ogni 5 o 3 secondi con il metatag apposito, ma
non capisco come fai a controllare che l'utente abbia ancora la pagina
aperta con javascript?


 aperta con javascript?
Hmm, chiaro che non hai un evento che dice che sia gia' via (e non esiste
modo, non e' una connessione persistente). Ma quando ti serve l'informazione
la puoi controllare con un semplice controllo server-side (pseudo-code):
if ($utente->refresh() > 1 minuto) --> timeout / l'utente e' via (DELETE
FROM... )
Questo lo potresti mettere in uno script che viene chiamato ogni  minuto
(con scheduler sotto windows oppure cron in unix).
Potrebbe essere anche chiamato in tutti i script dei utenti che chiami ogni
3-5 secondi (ma mi sembra un po' pesante di fare un controllo per ogni
utente collegato, se sono 10 utenti, fai un check ogni 1/3 secondo). Penso
che ogni minuto dovrebbe bastare per vedere se un utente e' ancora online
(visto anche la qualita' delle connessioni). Pure in sistemi IRC o ICQ i
server non reagiscono sempre subito ed esiste una latenza che varia tra
pocchi secondi a vari minuti.

pocchi secondi a vari minuti.
Io ho visto fare una chat del genere, ma era in asp e mi hanno
spiegato che esiste una variabile application oltre a session, che
praticamente è una sessione che raggruppa tutti gli utenti che hanno
una session. Con questo tipo di tecnologia è molto più semplice...
