usando - ¿Cuál es la forma más fácil de determinar si un usuario está en línea?(PHP/MYSQL)
registro y reconocimiento de usuarios con php (10)
¿Hay alguna manera de que pueda llevar a cabo sesiones para saber si el usuario está en línea?
Es decir: uso los registros, establezco una variable $ _SESSION, el usuario agota el tiempo de espera - cookie El recopilador de basura actualiza la base de datos para actualizar su estado como desconectado.
EDIT:
Quiero una solución que no implique tiempos o fechas. Quiero algo en las sesiones o algo similar. Adivinar si alguien está en línea no es lo suficientemente bueno para lo que necesito.
Almacene la zona horaria en la tabla y utilícela en un cálculo para encontrar la hora local de los usuarios en comparación con la hora local del usuario que visualiza la página.
Editar:
Mejor aún, almacene todos los tiempos como la hora del servidor, y base todos los cálculos relativos solo a la hora del servidor.
Aquí hay una forma de obtener la diferencia entre dos fechas de una base de datos en minutos, luego verificar la diferencia y establecer el estado en línea / fuera de línea.
$query = ''SELECT * FROM Users'';
$result = mysqli_query($mysqli, $query);
foreach($result as $user){
// date from the database
$dbLastActivity = date("d-m-Y h:i:s a", strtotime($user[''lastOnline'']));
// date now
$now = date("d-m-Y h:i:s a", $date);
// calculate the difference
$difference = strtotime($now) - strtotime($dbLastActivity);
$difference_in_minutes = $difference / 60;
// check if difference is greater than five minutes
if($difference_in_minutes < 5){
// set online status
$updateStatus = ''UPDATE Users SET Status="online" WHERE lastOnline="''.$user[''lastOnline''].''"'';
} else {
// set offline status
$updateStatus = ''UPDATE Users SET Status="offline" WHERE lastOnline="''.$user[''lastOnline''].''"'';
}
// check if mysqli query was successful
if (!$mysqli->query($updateStatus)){
printf("Error Message %s/n", $mysqli->error);
}
}
Dependiendo de su situación, puede ser mejor para usted crear una tabla separada "cuyo-online" con las columnas: "ip" y "last-updated-time" y consultar / actualizar esta tabla cada vez que un usuario carga una página.
En las consultas de carga de página pueden incluir :
- Actualice / inserte la tabla "cuyo-en-línea" para el usuario actual basado en ip.
- Eliminar filas "caducadas" (también se puede hacer periódicamente usando cronjob).
- Contar usuarios "activos".
Beneficios de usar esta técnica :
- Si un usuario no está conectado, todavía se lo está contando / rastreando.
- Depende de la cantidad de usuarios que tengas, consultar esta tabla puede ser más rápido.
Nota: Si usa esto, debe tener en cuenta que cualquier vista de página creará una fila en su tabla, de modo que, según el agente de uso, puede ignorar los bots o solo contar los populares (Firefox, IE, Safari, Opera, etc.).
La solución que he implementado para esto es, en cada carga de página de un usuario autenticado, establecer / restablecer una var memcache como "user_ {userid} isonline" => true y expirar en 5 minutos. Luego, compruebe si la var está en la memoria caché cuando accedo a la información del usuario. Dependiendo del tamaño de su base de usuarios, si desea obtener una lista de todos en línea, puede usar una llamada a Memcache getmulti con una serie de claves "user {userid} _isonline" para todos sus usuarios.
por supuesto, esto realmente depende de con qué frecuencia un usuario cambiará las páginas de su sitio ... para obtener una representación más precisa de los usuarios en línea, podría implementar una llamada ajax xmlhttprequest en su página ejecutándose en un pequeño intervalo (30 segundos o so) que restablece el memcache var, y hace que el memcache var expire en menos tiempo (1 minuto para tener en cuenta posibles problemas del navegador). Esto no es TOTALMENTE preciso, pero como http no tiene una conexión permanente con el servidor, usted está bastante limitado en lo que puede hacer.
Si necesita una segunda representación de quién está en línea, es posible que tenga una aplicación flash cargada en su página que se conecta a un servidor jabber, luego simplemente verifique si ese usuario en particular está conectado en el servidor.
Lo que está pidiendo (después de la aclaración) es, por definición, imposible. HTTP es un protocolo sin conexión, por lo que tan pronto como un usuario ha golpeado una página y todo el contenido vuelve del servidor al navegador del usuario, no hay conexión entre los dos. Alguien está "en línea" con su sitio web por menos de un segundo.
Una cosa que podría hacer es tener JavaScript en su página web para que las solicitudes AJAX vuelvan a su servidor de forma regular, lo que incluye información de identificación, y una solicitud AJAX diferente cuando el usuario abandona la página, usando window.onbeforeunload .
Mi camino puede no ser el mejor, pero dado que mi sitio y mi base de usuarios están en MySQL DB, cuando un usuario inicia sesión en mi sitio,
- Actualizo la tabla de usuarios para decir que están en línea
- Insertarlos en una mesa en línea
- Luego configuré una sesión con la hora actual
Luego, en cada carga de página que verifico para la sesión de tiempo en línea, si existe, reviso para ver qué edad tiene, si tiene menos de 5 minutos de antigüedad, no hago nada, si es anterior a 5 minutos, luego actualizo la hora de la sesión de nuevo con la hora actual y también actualizar la tabla de usuarios en línea con el tiempo
Luego tengo un trabajo cron que se ejecuta cada 10 a 15 minutos que elimina cualquier uso de la tabla en línea y marca la tabla de usuario como fuera de línea si el tiempo en línea se ha actualizado en X cantidad de minutos
No te molestes en descifrar las diferencias entre las zonas horarias. Eso no es necesario.
Siempre que el usuario acceda a una página, actualice un campo en su registro de la última vez que actualice la tabla Usuarios. A continuación, realice una consulta para todos los usuarios que tengan una última actualización en los últimos 5 minutos. Algo más que esto, y se consideran "fuera de línea".
Si utiliza su tiempo de servidor, a través de la función NOW () en MySQL, deberá calcular de forma paralela las diferencias entre las zonas horarias.
Esta es la forma estándar de hacer un seguimiento de cuántos usuarios están actualmente en línea (es decir, activo en los últimos minutos).
Constantemente actualizado
Si desea saber que todavía están activos, incluso cuando no están saltando de página en página, incluya un poco de javascript para hacer ping a su servidor cada 60 segundos o más o menos para avisarle que todavía están vivos. Funcionará de la misma manera que mi sugerencia original, pero actualizará sus registros sin requerir que exploren frenéticamente su sitio al menos una vez cada cinco minutos.
var stillAlive = setInterval(function () {
/* XHR back to server
Example uses jQuery */
$.get("stillAlive.php");
}, 60000);
Parece que su lógica de comparación "es la persona en línea" no tiene en cuenta las zonas horarias. Si está tratando con zonas horarias de esta manera, le recomiendo encarecidamente que almacene todas sus horas en GMT y las convierta a la hora local para sus usuarios justo antes de mostrarlas. Esto hará que cualquier operación de comparación sea muy simple.
Hay un buen hilo SO sobre husos horarios here .
También puede usar la etiqueta onunload
... En el cuerpo Más información aquí ( https://www.w3schools.com/jsref/event_onunload.asp )
De esta forma, no tiene que esperar de 4 a 5 minutos para que el usuario se desconecte.
Pero aún debes usar el método de actualización ajax en caso de que el navegador del usuario se bloquee ...
Una cosa que aconsejaría es almacenar este tipo de información en la memoria con, por ejemplo, memcached o mysql heap o redis. Porque de lo contrario la base de datos se golpeará mucho.