2012-05-25 17 views
8

Sto sviluppando un progetto mio con in mente la scalabilità e sono arrivato a un bivio. Sul mio sito web vorrei rilevare se un utente è online o meno. E non riesco a pensare al modo migliore per gestirlo. Il modo in cui pensavo sarebbe qualcosa in questo senso (in psuedocodarlo):PHP: il modo più efficiente per tenere traccia se un utente è online?

// SQL user table: 
user { 
    "name": "blah blah", 
    "email": "[email protected]", 
    "online": false 
} 

Così ogni volta che l'utente accede ho potuto aggiornare la sua colonna online a true. Tuttavia questo alla fine porterebbe a interrogazioni SQL che si verificano ogni volta che un utente accede e, se capita che io dica, 10 accessi al secondo, beh, si stanno verificando molte query. Un altro modo in cui ho pensato che avrei potuto fare la stessa cosa, ma in una tabella diversa:

// Activity table: 
activity { 
    "user_id": 2, 
    "online": true 
} 

Per qualche ragione credo che porterebbe a un minore consumo di memoria a causa della separazione dalla tabella user. Tuttavia non sono sicuro se avrebbe alcun effetto reale sulle prestazioni.

Quindi se potessi benedirmi con la tua intuizione sarei più che grato, grazie.

+0

Sembra un'ottimizzazione prematura. Non mi preoccuperei per ora. Se e quando il tuo sito inizia a rallentare, sono sicuro che sarai in grado di identificare colli di bottiglia molto più significativi di questo. – Okonomiyaki3000

+0

È normale eseguire un numero di query SQL ogni volta che viene caricata una nuova pagina. Una query aggiuntiva non sarà visibile. – xbonez

risposta

8

In genere è prassi comune aggiungere una colonna alla tabella utenti per memorizzare il tempo lastActivity. Ogni volta che l'utente accede o accede a una pagina, memorizza l'ora corrente in quel campo. Se vuoi sapere se sono online o meno, controlla se l'ultima ora registrata si trova all'interno di una certa finestra, ad esempio cinque minuti. Puoi interrogare tutte le righe per vedere quanti utenti sono attualmente online come risultato.

Non sarei troppo preoccupato di eseguire query ogni pochi secondi: il server può gestirlo (supponendo che siano ben scritte e non molto dettagliate).

+0

Ottima idea, grazie! – Brandon

0

è possibile utilizzare datetime per tipo di campo e non dimenticate di registrare IP dell'utente in modo da poter monitorare il tempo o

0

A seconda di come si vuole farlo funzionare si hanno fondamentalmente due opzioni:

definire un timeout dopo il quale si considera un utente disconnesso Usa ajax/WebSockets/qualunque cosa per il polling utente

 1: Timeout 

Questo è il caso d'uso più semplice. Ogni volta che l'utente richiede una pagina, si aggiorna un timestamp nel proprio database.

Per scoprire quanti utenti sono online, si dovrebbe eseguire una query su questo database e fare un COUNT di utenti che sono stati attivi negli ultimi N minuti.

In questo modo otterrete un'idea relativamente precisa di quante persone stanno utilizzando attivamente il sito al momento.

 2: Constant polling 

Questo è un po 'più complesso da implementare a causa di dover aggiornare il server con Ajax. Altrimenti funziona in modo simile al # 1.

Ogni volta che un utente si trova su una pagina, è possibile mantenere aperto un websocket o effettuare richieste Ajax ogni N secondi al server.

In questo modo puoi avere una buona idea di quante persone hanno pagine aperte sul tuo sito al momento, ma se un utente lascia aperta la pagina nel browser e non fa nulla, le conterebbe comunque come in linea.

Una leggera modifica all'idea sarebbe quella di utilizzare uno script sul client per monitorare il movimento del mouse. Se l'utente non sposta il mouse sulla pagina per circa 10 minuti, si interromperà il polling o si disconnetterà il websocket. Questo risolverebbe il problema di mostrare agli utenti che sono inattivi come online.

Problemi correlati