Newsgroup: it.comp.www.php
Titolo: Users online

Vorrei inserire sul mio sito uno script che indichi quanti visitatori sono
attualmente connessi. Ho trovato qualche esempio in rete, ma utilizzano
tutti MySQL, che io invece voglio assolutamente evitare per il momento.
Avete links o suggerimenti?
----
Vito Dantona
vi...@milanmania.com
http://www.vitus.cjb.net
ICQ: 18231643



purtroppo nel post precedenteho sbagliato!!!!!!  non ho pensato che
effettivamente i sistemi operativi *nix permettono di scrivere
"contemporaneamente" sui file.... purtroppo pero' su un file breve (ho
fatto una prova) non e' possibile sapere con assoluta sicurezza quale
sara' il valore che effettivamente rimarra' nel file se le scritture
sono contemporanee.
un'idea piu' valida potrebbe essere quella di usare due file: uno
contenente la variabile ed uno di appoggio.
semplicemente quando uno script ha rilevato un nuovo utente controlla
se esiste il file di appoggio ( if file_exists("appoggio") ) e decide:
1)  il file esiste e quindi un altro script sta scrivendo sul file
variable, percio' attende
2) il file non esiste quindi nessuno sta scrivendo quindi posso
scrivere io: PRIMA crea il file appoggio ( es. touch("appoggio") ) poi
apre in scrittura il file variabile e infine dopo aver chiuso (e'
fondamentale farlo esplicitamente) il file varibile cancella il file
appoggio per dire che la risorsa e' libera.
questo e' il sistema che per esempio usa netscape navigator su linux e
solaris (forse anche su windows, ma non so) per determinare se
un'altra finestrta e' gia' aperta.
ah, leggendo il manuale di php, dalla verisone 4.0.1 in poi esiste una
funzione flock che servirebbe appunto a lockare un file per fare
appunto quanto dicevo io sopra, ma non l'ho mai provata e sempre nel
manuale dice che non e' affidbile con i filtri ISAPI (ovvero con
qualsiasi web server che abbia a che fare windows).
buona notte !
Roberto Padovani
----------------
ICQ#125729644
----------------

 wrote:

il problema e' interessante....  e stasera sono in vena di scrivere !
una prima idea potrebbe essere quella di tenere una specie di
variabile globale a tutte le esecuzioni php sul server... che so,
scrivendola in un file letto da ogni istanza di esecuzione degli
script.
il problema con questa soluzione pero' sono gli accessi
contemporanei... supponendo che il file in un dato istante contenga il
valore 5 e che si colleghino il 6 e il 7 utente contemporaneamente
quando ciascuno va a leggere il file trova il valore 5 e lo aggiorna
al valore 6 ed ammettendo che l'allucinante sistema operativo in uso
permetta a due esecuzioni diverse di aprire il file in scrittura, ci
si ritroverebbe con la variabile posta a 6 quando sono 7 gli utenti.
ma il problema del conto errato e' minimo, tanto solo uno dei due
script contemporanei riuscira' adaprire il file, mentre l'altro
ricevera' un errore.
volendo usarei un file comune, il primo workaround a venire in mente
per il problema di concorrenza suddetto potrebbe essere di attendere,
in uno script che tentando di aprire in scrittura per secondo il file
si trovasse con un permesso negato, fino a che non viene consentito
l'accesso al file, ovvero il primo script finisce........ beh se tutto
andasse sempre bene le attese sarebbero contenute, ma se uno script ti
si blocca e per una qualche assurda ragione php non termina
correttamente e non si chiude il file.... beh rimani piantato temo
fino al riavvio del web server..... e se il server non e' tuo stai
fresco  !!


 ha scritto nel messaggio
news:3ba92207...@news.interbusiness.it...


 funzione flock
flock
(PHP 3>= 3.0.7, PHP 4 >= 4.0.0)
LAMASE



lo dicevo appunto, ma il manuale sconsiglia l'uso con filtri ISAPI ...
soto IIS o IPlanet non si puo' usare, percio' meglio soluzione ad hoc.


 soto IIS o IPlanet non si puo' usare, percio' meglio soluzione ad hoc.
contestavo solo il fatto che dicevi che flock() era solo dalla 4.0.1 in
poi.. =)

*sito* (non semplicemente dalla pagina dove è presente il contatore)?
Non puoi.
Quindi bisogna che OGNI script faccia una cosa del genere:
	- generare un numero casuale, $RAND.
	- verificare se il file "index.txt" esiste.
	- se NON ESISTE:
		- attendere da 0 a 100 millisec, a caso
		- per un massimo di N volte, ripetere il tentativo
	- se ESISTE:
		- rinominarlo in $RAND.txt
	- se $RAND.txt NON ESISTE, c'e' stata una collisione, e si
	  ripete dall'inizio.
	- ora, SOLO QUESTO SCRIPT ha accesso a $RAND.txt e tutti i
	  suoi cloni aspettano.
	- leggere l'array $users dal file
	- eliminare tutti gli users dove la data di ingresso e' un
	  tot anteriore alla data attuale (5 minuti?)
	- aggiungere il record dell'user attuale
	- riscrivere dentro $RAND.txt:
		fwrite($fp, "\$users = array(\n");
		while( list($user, $time) = each($users))
			fwrite($fp, "\"$user\" => \"$time\",\n");
		fclose($fp);
	- rinominare $RAND.txt in "index.txt"
	...adesso, count($users) e' il numero di utenti simultanei
	(approssimativo <evil grin>).
Leonardo
-- 
Nior thainig ar major i dtus an lae chugainn,
is ni rabhamar fein ann i gcoir na gceart
ach mar sheolfai aoireacht bo gan aoire,
ar thaobh na greine de Sliabh na mBan.


fai qualche test anche su linux.
cmq se usi unix pare che tu possa usare la funzione flock() che cmq
poi fa quello che dicevo, semplicemente php si tiene un elenco dei
file bloccatti in un suo file di appoggio... magari fai dei test sia
con la flock che con lasoluzione ad hoc.
per l'altra cosa.... boh.... tieni traccia delle sessioni
(probabilmente lo fai gia') di ogni utente e in ogni pagina ci sara'
un controllo in javascript che quando la pagina viene abbandonata
chiami una tua pagina di chiusura in php in cui aggiorni.
in bocca al lupo!


Allora... facciamo un po' d'ordine:
Non ho avuto il tempo di provare le soluzioni suggerite, cmq credo di aver
capito il problema e (in linea di massima) le vostre proposte. Volevo fare
però una precisazione, perché probabilmente mi ero espresso male:
quello che io voglio è un contatore dei *visitatori* al sito in un certo
istante, non degli utenti registrati. (Che tra l'altro non sono previsti nel
mio sito, ragion per cui non utilizzo sessioni - senza contare il fatto che
non ne sono capace vista la mia scarsa esperienza di PHP!). Immagino che il
file index.txt di cui parlava Leonardo Serni abbia a che fare con le
sessioni, quindi non c'entra con il mio caso. Lo stesso vale per la risposta
di Roberto Padovani. In altri termini, sono al punto di partenza ;-)
Al di là di questo devo dire che PHP mi ha stupito per la semplicità: dopo
pochi giorni di utilizzo ho già realizzato uno script per cartoline virtuali
che ho appena implementato sul mio sito 
http://www.vitus.cjb.net
 (insieme a
qualche altro gadget minore). (A proposito, se doveste trovare qualche bug
fatemelo sapere...)


sessioni, quindi non c'entra con il mio caso.
No, lo puoi usare tranquillamente per sapere quanti sono gli utenti on
line.
Un sistema e' quello di associare a ciascun utente una "chiave" che e'
data dall'hash MD5 (funzione md5()) di $REMOTE_ADDR, $HTTP_USER_AGENT,
$HTTP_FORWARDED_FOR e $HTTP_VIA (controlla i nomi delle variabili...),
eventualmente in AGGIUNTA ad un cookie.
In questo modo, lo script fallisce solo se si presentano due utenti da
uno stesso IP (o dallo stesso proxy *SE ANONIMO*), che usano lo stesso
browser, senza cookies, ed entro 5/10 minuti... eccheccazzo! :-)
Altrimenti, cerchi la chiave MD5 in quell'array $users, se la trovi ne
aggiorni data e ora, se non la trovi la aggiungi. Fine del lavoro. Con
questo sistema, ogni utente "sconosciuto" viene aggiunto, quelli oltre
10 minuti di permanenza vengono espunti, gli utenti "conosciuti" sono,
invece, aggiornati.
Il numero di persone distinte on line da meno di cinque-dieci minuti a
questo punto e' in pratica il numero di visitatori.


 questo punto e' in pratica il numero di visitatori.
Se ho capito bene, si tratta quindi di un metodo approssimativo, cioč non
conto effettivamente i visitatori che stanno visualizzando la pagina
(d'altra parte, credo che questo sarebbe impossibile, giusto?), ma quelli
che l'hanno aperta entro un certo timeout. Questo risolverebbe il mio
problema principale che era quello di decrementare il contatore. Inoltre, mi
permetterebbe di perfezionare il counter evitando di contare i reload. Se
avrň tempo in questi giorni, darň un'occhiata al manuale per md5() e proverň
a implementare lo script, ma purtroppo temo che dovrň rimandare al prossimo
aggiornamento massiccio del sito ;-(
Grazie cmq a tutti
P.S.: Non ho capito perň come utilizzare il cookie


P.S.: Non ho capito però come utilizzare il cookie
Solo per identificare il cliente. Una volta che hai generato l'hash, puoi
mandarglielo come cookie,
	HASH_ID=...
...poi, se uno entra con un certo HASH_ID, usi l'HASH_ID che ti da', e se
entra senza, lo generi e glielo rimandi come cookie.
