2012-05-25 25 views
8

Estoy desarrollando un proyecto mío teniendo en cuenta la escalabilidad y he llegado a una encrucijada. En mi sitio web me gustaría detectar si un usuario está en línea o no. Y no puedo pensar en la mejor manera de manejar esto. La forma en que estaba pensando sería algo en este sentido (en psuedocode):PHP: ¿la manera más eficiente de rastrear si un usuario está en línea?

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

Así que cada vez que el usuario inicia sesión en que se pudo actualizar su columna online a true. Sin embargo, eso llevaría eventualmente a que las consultas SQL ocurran cada vez que un usuario inicie sesión y si sucede que recibo, por ejemplo, 10 inicios de sesión por segundo, bueno, eso es un montón de consultas. Otra manera pensé que podría hacer lo mismo pero en una tabla diferente:

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

Por alguna razón yo creo que daría lugar a un menor consumo de memoria debido a la separación de la mesa user. Sin embargo, no estoy seguro de si tendría algún efecto real en el rendimiento.

Así que si pudieran bendecirme con su visión, estaría más que agradecido, gracias.

+0

Esto parece una optimización prematura. No me preocuparía por el momento. En el caso de que su sitio empiece a ralentizarse, estoy seguro de que podrá identificar cuellos de botella mucho más importantes que este. – Okonomiyaki3000

+0

Es común ejecutar varias consultas SQL cada vez que se carga una página nueva. Una consulta adicional no será perceptible. – xbonez

Respuesta

8

En general, es una práctica común agregar una columna a la tabla de usuarios para almacenar el tiempo lastActivity. Cada vez que el usuario inicie sesión o acceda a una página, almacene la hora actual en ese campo. Si desea saber si son o no en línea, vea si la última hora registrada está dentro de una ventana determinada, es decir, cinco minutos. Puede consultar todas las filas para ver cuántos usuarios están actualmente en línea como resultado.

No me preocuparía mucho la ejecución de consultas cada pocos segundos; su servidor puede manejarlo (suponiendo que estén bien escritos y no sean muy detallados).

+0

¡Gran idea, gracias! – Brandon

0

puede utilizar de fecha y hora para el tipo de campo y no se olvide de registrar IP del usuario para que pueda controlar el tiempo o

0

Dependiendo de cómo se quiere que funcione básicamente tiene dos opciones:

definir una tiempo tras el cual se tiene en cuenta un usuario conectado a cabo uso ajax/websockets/lo que sea para sondear usuario

 1: Timeout 

Este es el caso de uso más sencillo. Cada vez que el usuario solicita una página, usted actualiza una marca de tiempo en su base de datos.

Para saber cuántos usuarios hay en línea, debe hacer una consulta en esta base de datos y hacer un RECUENTO de usuarios que han estado activos en los últimos N minutos.

De esta manera obtendrá una idea relativamente precisa de cuántas personas están utilizando activamente el sitio en este momento.

 2: Constant polling 

Esto es un poco más complejo de implementar debido a tener que actualizar el servidor con Ajax. De lo contrario, funciona de manera similar a la # 1.

Cuando un usuario está en una página, puede mantener un websocket abierto o hacer peticiones ajax cada N segundos al servidor.

De esta manera puede hacerse una idea bastante buena de cuántas personas tienen páginas abiertas en su sitio actualmente, pero si un usuario deja la página abierta en su navegador y no hace nada, aún las consideraría como en línea.

Una pequeña modificación a la idea sería usar un script en el cliente para monitorear el movimiento del mouse. Si el usuario no mueve el mouse en su página durante, por ejemplo, 10 minutos, detendrá el sondeo o desconectará el websocket. Esto solucionaría el problema de mostrar a los usuarios que están inactivos como en línea.

Cuestiones relacionadas