Pregunta

Tengo problemas para averiguar cómo puedo contar la cantidad de usuarios iniciados en mi aplicación.

Lo que tengo: Cuando un usuario inicia sesión, obtiene una sesión (que se usa cuando el usuario desea visitar una página protegida) y la columna IsloggedIn para el usuario en la tabla de usuarios está configurada en 1 para indicar que el usuario está iniciado. Segurra sesión en el usuario, el valor se establece en 0. contar el número de 1 en la tabla de usuarios facilita la devolución del número de usuarios iniciados. Pero...

El problema: Si el usuario cierra el navegador sin cerrar la sesión, el valor en la base de datos se mantiene 1, lo que indica que el usuario todavía ha iniciado sesión a pesar de que su sesión ha terminado cuando cerró el navegador.

Pregunta: ¿Podría alguien sugerir una forma adecuada de hacer esto?

¿Fue útil?

Solución

En lugar de una columna de Isloggedin, debe agregar una columna de última hora. Cada vez que una persona visita una página que actualiza la columna:

UPDATE members SET LastTimeSeen = NOW() WHERE id = $the_user_id

Luego, para obtener cuántas personas hay en el sitio en cualquier momento que use la consulta:

SELECT COUNT(*) FROM members WHERE LastTimeSeen > DATE_SUB(NOW(), INTERVAL 5 MINUTE)

Eso muestra cuántas personas han visto una página en los últimos 5 minutos, que es lo mejor que obtendrá sin una solución mucho más complicada.

Otros consejos

Solo para ofrecer otra solución:

if ($user->isLoggedIn()) {
  touch("/writable/path/loggedInUsers/" . $user->id);
}

Si no necesita consultar estos datos, un toque de archivo local es mucho más rápido que una escritura de DB. Para iniciar sesión en los usuarios, escanee el directorio en busca de tiempos de filemo inferior a los segundos de edad.

Debido a la forma en que se construye nuestro sitio, era necesario usar el enfoque AJAX. Estoy usando jQuery, así que es relativamente indoloro.

Estas líneas entraron en la función $ (documento).

fnShowImOnline();
setInterval('fnShowImOnline', 120000);

Esta es la función JavaScript ...

function fnShowImOnline() {
    $.get('ajax/im_online.php');
}

Y aquí está el PHP

<?php
    session_start();
    if ((isset($_SESSION['user']))&&($_SESSION['authorized']=='authorized')) {
        include('../includes/db.php');
        db_connect();
        mysql_query("UPDATE members SET last_checked_in = NOW() WHERE user_id = {$_SESSION['user']['user_id']}");
    }

?>

El recuento es recto php/mysql.

//  Members online.
$online_sql = "SELECT COUNT(*) FROM members where last_checked_in > DATE_SUB(NOW(), INTERVAL 5 MINUTE)";
$online_RS = mysql_query($online_sql);
$online_row = mysql_fetch_row($online_RS);
$online = $online_row[0];

Para aquellos momentos que necesito actualizar los números dinámicamente, este poco de AJAX hace el truco.

$.ajax({
    url: 'ajax/members_online.php',
    dataType: 'json',
    success: function(response) {
        if (!isNaN(response.total)) {
            $('#OnlineTotal').html(response.total + " Total ");
            $('#OnlineOnline').html(response.online +  " Online Now");
        }
    }
})

Usando esto para el PHP/MySQL

//  Members online.
$online_sql = "SELECT COUNT(*) FROM members WHERE last_checked_in > DATE_SUB(NOW(), INTERVAL 5 MINUTE)";
$online_RS = mysql_query($online_sql);
$online_row = mysql_fetch_row($online_RS);
$online = $online_row[0];
//  Members total.
$total_sql = "SELECT COUNT(*) FROM members";
$total_RS = mysql_query($total_sql);
$total_row = mysql_fetch_row($total_RS);
$total = $total_row[0];
$response = json_encode(array('total'=>$total,'online'=>$online));
echo($response);

Esto está funcionando bien para nosotros.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top