Ajax per calcolare tempo di permanenza

defra91

Nuovo Utente
12 Gen 2013
7
0
0
30
www.defraworks.com
Salve a tutti. Di seguito vi porrò il mio problema e in seguito la mia pseudo-soluzione, così mi date le vostre opinioni:

PROBLEMA:

Voglio realizzare un sistema di statistiche di accesso da utilizzare per qualsiasi sito web cui avrò modo di lavorare. Le statistiche le realizzerò tramite una tabella MySQL che contiene le varie informazioni, come ad esempio la data di accesso, l'ora di accesso, l'ip,.., ecc. Il mio unico problema riguarda il tempo di permanenza dell'utente nel sito, ovvero il tempo che intercorre tra l'entrata nella pagina e l'uscita. Per il tempo di entrata non è un problema, la questione semmai è intercettare il tempo di uscita, ovvero quando l'utente chiude il browser o la scheda. Ho letto molti post a riguardo, molti consigliavano di catturare l'evento onUnload o onBeforeUnload (che a quanto ho capito è compatibile solo con IE). Ho provato a realizzare alcune prove ma senza successo.

SOLUZIONE:

Ecco quindi che stanotte finchè rimuginavo tra le mille ipotesi ho avuto un'idea (un po' folle e sicuramente non il massimo): imposto una funzione javascript (con Ajax) che ogni secondo mi esegue lo script di aggiornamento del tempo di permanenza sul db. Per spiegarmi meglio, eseguo con Ajax un'aggiornamento costante di un record in un database. Ho preso naturalmente la cosa con le pinze perchè se da un lato essa si rivela soddisfacente ai fini del mio problema dall'altro posso presumere che tutto ciò rallenti la navigazione.

Fatemi sapere cosa ne pensate e se avete soluzioni migliori vi ringrazierei molto se le condividessi (non chiederò mai di postare codice).

Grazie in anticipo
 

alessandro1997

Utente Attivo
6 Ott 2009
5.302
1
0
24
Roma
alessandro1997.netsons.org
Inviare una richiesta AJAX a ogni secondo mi sembra piuttosto poco conveniente. Che io sappia l'evento onbeforeunload funziona decentemente in tutti i browser moderni. Sarai forzato, però, a visualizzare un messaggio prima dell'uscita dell'utente.
 

defra91

Nuovo Utente
12 Gen 2013
7
0
0
30
www.defraworks.com
Inviare una richiesta AJAX a ogni secondo mi sembra piuttosto poco conveniente. Che io sappia l'evento onbeforeunload funziona decentemente in tutti i browser moderni. Sarai forzato, però, a visualizzare un messaggio prima dell'uscita dell'utente.

Ti ringrazio anzitutto della risposta. Il problema è che io non mi posso permettere di visualizzare un messaggio all'uscita, devo trovare un'altra strada. Al momento questa mi sembra quella che soddisfa appieno le mie esigenze. In fin dei conti si tratta di eseguire due tre righe di codice PHP ogni secondo. A tuo parere è poco conveniente per quale motivo?
 

alessandro1997

Utente Attivo
6 Ott 2009
5.302
1
0
24
Roma
alessandro1997.netsons.org
Perché sia il server che il client devono gestire una richiesta HTTP al secondo. Supponiamo che ci siano 50 utenti online sul tuo sito: il tuo server riceve (senza contare le visite) 50 richieste al secondo, che non sono ovviamente tante ma nemmeno poche. Comunque ti consiglio di provare e vedere come va; se ti soddisfa, lascia così.
 

Sevenjeak

Utente Attivo
27 Nov 2012
80
2
8
33
sevenjeak.altervista.org
Invece di ajax io ti consiglierei il php, soprattutto per non appesantire la navigazione, anche perché io ho avuto il tuo stesso problema e lo risolto tramite php, ora spiego meglio:

Se l'utente effettuasse il login sarebbe migliore, visto che in questo caso li basterebbe effettuale il logout, ma anche in questo caso se l'utente non effettua il logout l'utente risulterebbe sempre online, ma per questo, alcune community hanno un sistema di auto-logout, che potresti utilizzare anche te, con qualche modifica, solamente, l'unico problema, l'utente non viene considerato non presente nel tuo sito quando esce dalla pagina, ma se inattivo per un tot di tempo.

Mettiamo caso, che come abbia tetto te nel record dell'utente si sia un campo, nominato timestamp, contenente il timestamp dell'utente, che dovresti aggiornare ogni tal volta che l'utente aggiorni la pagina, ovviamente prima verificando se l'ip dell'utente corrente e quello del database, in oltre il tuo script, oltre a questo codice dovrà contenere un codice, eseguito da chiunque esegue la pagina, che controlli se nel database è presente un timestamp ad esempio inferiore ad un tot di minuti rispetto al timestamp corrente, in questo caso cancelli il record dell'utente, ed in questo modo puoi considerare l'utente disconnesso.

P.S.: L'unica soluzione per me e questa, ma purtroppo non controlla se l'utente e connesso / disconnesso in tempo reale, ma l'utente risulta disconnesso solo se per un tot di tempo non fa nessuna azione ( aggiorna la pagina o altro ), altrimenti come detto, si rallenta la navigazione.
 
Ultima modifica:

defra91

Nuovo Utente
12 Gen 2013
7
0
0
30
www.defraworks.com
Invece di ajax io ti consiglierei il php, soprattutto per non appesantire la navigazione, anche perché io ho avuto il tuo stesso problema e lo risolto tramite php, ora spiego meglio:

Innanzitutto ti ringrazio della risposta esauriente. Purtroppo il mio problema è diverso. Il sito che devo gestire è una semplice vetrina di un ristorante, per cui non ho aree in cui gli utenti effettuano login/logout, ma semplicemente ogni visitatore anonimo è considerato da me un utente. Ti spiego meglio: una volta che tu entri nella home automaticamente vieni "schedato" sul database. Uno script PHP si occupa di inserire un nuovo record nel db contenente un identificativo (chiave primaria), la data di accesso, l'ora di accesso, il browser utilizzato, la piattaforma utilizzata,.... ecc. Inoltre esiste un'attributo della tabella che si chiama "tempo_permanenza". Ora il problema è quello di capire quando l'utente esce dalla mia pagina, e questo lo posso fare solo lato client, quindi di fatto PHP, che è lato server, purtroppo in questo caso non può essermi utile in quanto non riesce a rendersi conto degli eventi che avvengono nel browser.

Poi cmq tieni conto che non dovrei ogni volta effettuare una riverifica dell'IP, in quanto tutto ciò viene risolto grazie alle meravigliose variabili di sessione. Una volta che entri nella Home PHP istanzia una variabile di sessione $_SESSION['visitor'], impostando il suo valore all'identificativo (nel db) dell'utente corrente. In questo caso quando aggiorno il tempo di permanenza aggiorno il record che ha quell'identificativo.
 

Sevenjeak

Utente Attivo
27 Nov 2012
80
2
8
33
sevenjeak.altervista.org
Si si, ho capito che l'utente nel tuo sito rimane anonimo, non effettua il login, infatti lo scritto nel mio precedente messaggio, quello del login era solo un mio esempio, forse spiegato male, per spiegarti la mia soluzione, in poche parole, in un sistema di login ( non il tuo ) gestisci il record dell'utente presente nel database ( per verificare se è connesso o disconnesso ), mentre nel tuo sistema ( no di login ) registri sempre i dati del visitatore nel db, ma nessuno di vieta di gestirli allo stesso modo, lo so che php è lato server e per questo non gestisce gli eventi del client, te lo consigliato soprattutto per non far rallentare la navigazione all'utente, cosa che non ti consiglio, visto che in questo modo, visto la lentezza, l'utente è probabile che decida di abbandonare il sito.

Cmq, lasciando perdere il php, e per evitare che il tuo metodo rallenti la navigazione, ora che ci penso, in alcuni siti consigliano, proprio per questo, di far eseguire il codice ajax, che controlli che il visitatore si trova nel tuo sito, da una finestra pop-up che si apre quando l'utente visita il tuo sito, ma purtroppo anche questa soluzione non è una delle migliore, anche perché la finestra popup può essere chiusa dall'utente prima che lui lasci la pagina.

Cmq mi viene da pensare in questo momento, e se gestisci la cosa con un'applet java, cosi da poter creare un nuovo thread per non influire, credo, la navigazione? almeno oltre a evitare il rallentamento del browser eviti che il codice non sia eseguito per via della disattivazione di javascript.
 
Ultima modifica:

defra91

Nuovo Utente
12 Gen 2013
7
0
0
30
www.defraworks.com
Una Java Applet potrebbe essere una soluzione efficiente sì. Il problema è che pregiudicherebbe quella porzione di utenti che non hanno installato Java nel loro browser, quindi sarebbe discriminante e non risolverebbe appieno il mio problema. Quello di cui avrei bisogno io è solamente di intercettare l'uscita dal browser o dalla scheda senza pop-up, ma, da come ho avuto modo di leggere, sembra non sia possibile. Comunque, facendo due conti, una senplice query SQL di update in un buon server dovrebbe richiedere un tempo nell'ordine dei millisecondi. Per quanto riguarda il sovraccarico del server Apache, il codice PHP utilizzato consiste di solamente 25 righe di codice; te lo posto così ci intendiamo meglio:

PHP:
require("config.php");
$id = $_SESSION['visitor'];
$query = "update accesso set tempo_accesso = tempo_accesso + 1 where id_accesso = $id";
mysql_query($query, $connessione);

il file config.php esegue l'accesso al db e consiste di 15 righe e restituisce la variabile $connessione.
 

Sevenjeak

Utente Attivo
27 Nov 2012
80
2
8
33
sevenjeak.altervista.org
Aspetta, non ti sto seguendo, sarà che ho appena finito di fare altre cose o altro bho... a cosa ti stai riferendo? cmq ogni metodo che abbiamo elencato a i suoi problemi:

  • Il controllo fatto da Ajax ( che controllo se l'utente si disconnette ) rallenta la navigazione e non è eseguibile nel caso l'utente disattivasse il javascript, almeno ché permetti di visitare il sito solo con il supporto javascript
  • Il controllo fatto dentro una finestra pupup forse, non saprei, permette di non rallentare la navigazione al sito, visto che si trova in una finestra separata, ma purtroppo c'è la possibilità che il popup venga chiuso prima di disconnettersi dal sito
  • con un'applet puo andare bene, ma se l'utente no ha installato il software java, cosa che non avevo pensato, il controllo non viene eseguito
  • con php sei sicuro che il controllo viene eseguito, visto che è il server e no il client a eseguirlo, ma non è in tempo reale, purtroppo non ho un esempio da postarti, ma questo metodo viene utilizzato da alcuni contatori visite, ma il problema, come già detto, non è in tempo reale e disconnette ( non so come dire ) l'utente se inattivo per un po di tempo, in'oltre il codice, per rilevare se l'utente è inattivo, deve essere eseguito da altri utenti, quindi oltre a non essere in tempo-reale c'è la possibilità che nessun altro esegue il codice per verificare l'inattivita del visitatore

Alla fine tutti questi metodi, hanno un problema, ajax e l'applet java aumenta la precisione del tuo script ( in senso che è in tempo real ) ma possono diminuire le prestazioni del sito, mentre php è l'opposto, ora non saprei, per te nel tuo sito quanto è necessario registrare i dati del visitatore?
 

defra91

Nuovo Utente
12 Gen 2013
7
0
0
30
www.defraworks.com
Di fatto io potrei benissimo realizzare le mie statistiche d'accesso tralasciando il tempo di permanenza, gli altri dati per conto loro sono già una buonissima raccolta di dati. Volevo solo provare a vedere se esisteva un sistema per calcolare il tempo di permanenza, se poi il problema è insolubile o le loro soluzioni non sono performanti lascerò stare. In fondo si tratta solo di un mio "capriccio" ;)
 

Longo8

Utente Attivo
28 Mar 2011
1.694
0
36
Quoto a pieno ciò che è stato scritto da Sevenjeak. Aggiungo un particolare:
Come effettuo io e anche tanti altri siti per controllorare se l'utente è online basterebbe che ad ogni aggiornamento di pagina (per qualsiasi utente) si aggiorna la tabella UTENTI_ON e eliminare tutti gli utenti che hanno un timestamp 'vecchio' di $tot minuti. Ovviamente ogni volta che una pagina viene aperta o aggiornata si aggiorna anche il timestamp dell'utente che esegue questa operazione.

Poi il tempo $tot secondi/minuti lo scegli in base al tipo di sito.
-Mettiamo caso che sia un forum: non credo che su un forum un utente cambia pagina o altro ogni secondo ma neanche ogni minuto visto che se deve leggere qualcosa un pò di tempo ci mette; allora va off dopo 10 minuti di inattività (per esempio).
-Prendiamo ad esempio fb: un utente loggato su facebook (e che lo sta utilizzando) aggiorna molte pagine in poco tempo quindi già 10 minuti sarebbero troppi (in linea teorica). Loro avevano adottato un metodo che mandava in INATTIVO coloro che erano on ma non lo stavano utilizzando per qualche minuto.
Ora hanno completamente eliminato questa pratica visto l'inutilità.
 

alessandro1997

Utente Attivo
6 Ott 2009
5.302
1
0
24
Roma
alessandro1997.netsons.org
In ogni caso se vuoi raccogliere statistiche sui visitatori del tuo sito è decisamente meglio utilizzare un prodotto come Google Analytics o, se hai bisogno di funzioni enterprise, ci sono anche delle ottime soluzioni a pagamento.
 

defra91

Nuovo Utente
12 Gen 2013
7
0
0
30
www.defraworks.com
In ogni caso se vuoi raccogliere statistiche sui visitatori del tuo sito è decisamente meglio utilizzare un prodotto come Google Analytics o, se hai bisogno di funzioni enterprise, ci sono anche delle ottime soluzioni a pagamento.

Sì sì so benissimo che esistono prodotti che fanno tutto questo automaticamente. Il problema è che per me che sviluppo siti avere un programma mio personale che fa tutto questo è decisamente meglio che andare da altri.
 

alessandro1997

Utente Attivo
6 Ott 2009
5.302
1
0
24
Roma
alessandro1997.netsons.org
E perché mai? Ci sono molti siti Web famosi che utilizzano sistemi di statistica esterni, così come conosco molti programmatori (programmatori seri, di quelli da decine di migliaia di euro a progetto) che li adottano. La regola generale è che se esiste già un prodotto che soddisfa le tue esigenze è meglio usarlo: devi manutenere meno codice e sai che ha alle spalle un bacino esteso di utenza che lo testa continuamente.
 
Ultima modifica:

Longo8

Utente Attivo
28 Mar 2011
1.694
0
36
Quoto a pieno Alex. Poi se hai un qualcosa di alto livello e già pronto, utilizzabile, e perennemente aggiornato perché rifarlo da solo se non sarà mai a quel livello?
 
Discussioni simili
Autore Titolo Forum Risposte Data
M Fullcalendar in Codeigniter, un aiuto per la chiamata $ajax ? jQuery 0
motleyrulez Chiamata ajax per tabella php PHP 3
D [Javascript] pulsanti per comandi shell con php e ajax Ajax 7
M Problema chiamata Ajax per vista Griglia o vista Lista Ajax 1
T [MYSQL] Richieste in Java per funzione Ajax MySQL 0
P php jquery ajax per modificare valore in un databe Ajax 1
S mulit request ajax pattern per gestirle Ajax 0
M [risolto] Script ajax per form e mappe Ajax 6
P Ajax jquery inserire un loader per motore di ricerca Ajax 2
D Richiesta ajax per piu commenti Ajax 2
V [JQuery] Aiuto per funzione Ajax jQuery 0
S JS o Ajax per Data Mining Email su elenco indirizzi. Javascript 5
M EDITOR DI TESTO: tinyMCE e Ajax per l'upload di immagini da pc Ajax 12
C Cercasi programmatori php 5, javascript + ajax, css e mysql per portale di videogames Altri Annunci 0
M script javascript e ajax per form dinamico. Ajax 8
F Configurazione PHP/Apache per gestire AJAX PHP 1
R Aggiornare record mysql con Ajax, jQuery e php Ajax 2
P Funzione jQuery Ajax invio file a php jQuery 1
E Php select option e ajax PHP 23
Emix Select concatenate php sql ajax PHP 2
MarcoGrazia Valori di ritorno json via ajax non visti. jQuery 1
felino ASP.net MVC: Exception e chiamata AJAX ASP.NET 1
motleyrulez Ricerca filtro con Ajax PHP 1
max1974 Grafico Ajax Javascript 4
max1974 Struttura $.ajax Ajax 7
C la chiamata ajax non ritorna alcun dato Ajax 1
max1974 Lettura Risultato $.ajax Javascript 1
max1974 [Javascript] Grafico chartjs con dati da J.ajax Javascript 3
O [PHP] inviare dati da form e script ajax PHP 0
F limit show datatable ajax Ajax 1
Domenico_Falco1 Rendere dinamico un sito web con chiamate ajax e php e variabili json PHP 12
G Eseguire codice solo al termine della chiamata ajax Ajax 1
L Problema jQuery validation AJAX (PHP 7) PHP 6
max1974 [Javascript] Grafico ajax non funziona Javascript 0
WorldWideWeb Ajax POST con risposta JSON Ajax 2
M leggere con jquery/ajax in una function javascript record di database sql server Javascript 0
A [Javascript] Ajax, Jquery e PHP Javascript 1
X Problema con jquery e ajax jQuery 2
B [PHP] variabili globali in chiamate ajax PHP 0
B DEBUG - PHP+JS+AJAX PHP 10
M Inserimento dati checkbox multipli in db da ajax a php PHP 1
Axis18 Creare una barra di avanzamento con $.ajax Ajax 7
otto9due Chiamata ajax su due url è possibile? Ajax 0
G [Javascript] Problema parametro passato con ajax Javascript 4
G Chiamata ajax restituisce errore random Ajax 1
paloppa [PHP] paginazione con ajax PHP 1
filomeni Ajax e https Ajax 4
bubino8 Ajax con risultato si/no Ajax 16
A redirect da pagina php chiamata da ajax PHP 2
L Aggiungere contenuto con ajax durante lo scroll jQuery 1

Discussioni simili