Contar Usuarios en Línea

>> //seccion/php/ -- 4 comentario /// Agregado el 2005-09-07 @ Por kaioken

La mayoría de las páginas web hoy en día, necesitan saber cuantas personas visitan su página. Lo normal es tener un simple contador; ahora se necesitan más detalles y uno de esto es cuantos usuarios tienes en un cierto momento tú página.

Esta es una clase que utilizas para poder contar la cantidad de usuarios activos que tienes en tu página web. De esta manera saber que tan popular va tu site en ciertas horas. Ademas es bueno siempre saber la cantidad de personas en linea, como webmaster motiva a trabajar mas en una pagina cuando vez muchas personas interesadas en tu obra maestra.

Crea la Tabla


Antes de todo necesitamos tener la tabla donde se va almacenar todo la información de nuestros usuarios en linea. ¿Porque no un archivo plano? pues porque es mas facil manejarlo con la base de datos.

Codigo:
1
2
3
4
5
6
7
8
9
10
<?php
CREATE TABLE 
`useronline` (
  `
idint(10NOT NULL auto_increment,
  `
ipvarchar(15NOT NULL default '',
  `
timestampvarchar(15NOT NULL default '',
  `
localtionvarchar(100NOT NULL default '',
  
PRIMARY KEY  (`id`),
  
UNIQUE KEY `id` (`id`)
ENGINE=MyISAM DEFAULT CHARSET=latin1
?>


usersOnlineMain.php - PHP5


Ahora que tenemos nuestra tabla creada lo unico que nos falta es nuestra clase que va a controlar todo para el manejo de los usuarios en linea. Conste que esta version es en PHP5
Codigo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
<?php
/**
 * UserOnline Class
 * 
 * clases para saber los usuarios en linea
 * 
 */

class usersOnlineMain
{

    private 
$timestamp;
    private 
$timeout 300;
    private 
$count 0;
    private 
$url;

    
/**
     * Constructor que inicializa todo para comenzar a contar usuarios en linea
     *
     * @param mysqli $db
     */
    
function __construct()
    {
        
$this->timestamp time();
        
$this->ip $this->ipCheck();
        
$this->url $_SERVER[REQUEST_URI];
        
$this->new_user();
        
$this->delete_user();
        
$this->count_users();
    }

    
/**
     * Esta funcion trata de sacar todoo los usuarios no importa si vienen de un proxy, y pork es importante?
     * ya que si todos tus users vienen de un proxy los contario como 1 solo usuario
     *
     * @return string
     */
    
private function ipCheck()
    {

        if (
getenv('HTTP_CLIENT_IP'))
        {
            
$ip getenv('HTTP_CLIENT_IP');
        }
        elseif (
getenv('HTTP_X_FORWARDED_FOR'))
        {
            
$ip getenv('HTTP_X_FORWARDED_FOR');
        }
        elseif (
getenv('HTTP_X_FORWARDED'))
        {
            
$ip getenv('HTTP_X_FORWARDED');
        }
        elseif (
getenv('HTTP_FORWARDED_FOR'))
        {
            
$ip getenv('HTTP_FORWARDED_FOR');
        }
        elseif (
getenv('HTTP_FORWARDED'))
        {
            
$ip getenv('HTTP_FORWARDED');
        }
        else
        {
            
$ip $_SERVER['REMOTE_ADDR'];
        }

        return 
$ip;
    }

    
/**
    * Agrega un nuevo usuario en linea
    *
    * @return  null;
    */
    
private function new_user()
    {

        
$query mysql_query("INSERT INTO useronline (ip, timestamp, localtion) VALUES ('$this->ip', '$this->timestamp', '$this->url')");

    }

    
/**
     * Borra a los usuarios en linea despues que se paso el tiempo limite de ellos
     *
     * @return  null;
     */
    
private function delete_user()
    {
        
$query mysql_query("DELETE FROM useronline  WHERE timestamp < ($this->timestamp - $this->timeout)");

    }


    
/**
     * Cuenta la cantidad de usuarios en linea
     *
     * @return int
     */
    
public function count_users()
    {
        
$result mysql_query("SELECT count(DISTINCT ip) FROM useronline ");

        
$count =  mysql_fetch_row($result);

        return 
$count[0];
    }

}
?>


usersOnlineMain.php - PHP4


Ahora que tenemos nuestra tabla creada lo unico que nos falta es nuestra clase que va a controlar todo para el manejo de los usuarios en linea. Conste que esta version es en PHP4
Codigo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
<?php

/**
 * UserOnline Class
 * 
 * clases para saber los usuarios en linea
 * 
 */

class usersOnlineMain
{

    private 
$timestamp;
    private 
$timeout 300;
    private 
$count 0;
    private 
$url;

    
/**
     * Constructor que inicializa todo para comenzar a contar usuarios en linea
     *
     * @param mysqli $db
     */
    
function usersOnlineMain()
    {
        
$this->timestamp time();
        
$this->ip $this->ipCheck();
        
$this->url $_SERVER[REQUEST_URI];
        
$this->new_user();
        
$this->delete_user();
        
$this->count_users();
    }

    
/**
     * Esta funcion trata de sacar todoo los usuarios no importa si vienen de un proxy, y pork es importante?
     * ya que si todos tus users vienen de un proxy los contario como 1 solo usuario
     *
     * @return string
     */
    
function ipCheck()
    {

        if (
getenv('HTTP_CLIENT_IP'))
        {
            
$ip getenv('HTTP_CLIENT_IP');
        }
        elseif (
getenv('HTTP_X_FORWARDED_FOR'))
        {
            
$ip getenv('HTTP_X_FORWARDED_FOR');
        }
        elseif (
getenv('HTTP_X_FORWARDED'))
        {
            
$ip getenv('HTTP_X_FORWARDED');
        }
        elseif (
getenv('HTTP_FORWARDED_FOR'))
        {
            
$ip getenv('HTTP_FORWARDED_FOR');
        }
        elseif (
getenv('HTTP_FORWARDED'))
        {
            
$ip getenv('HTTP_FORWARDED');
        }
        else
        {
            
$ip $_SERVER['REMOTE_ADDR'];
        }

        return 
$ip;
    }

    
/**
    * Agrega un nuevo usuario en linea
    *
    * @return  null;
    */
    
function new_user()
    {

        
$query mysql_query("INSERT INTO useronline (ip, timestamp, localtion) VALUES ('$this->ip', '$this->timestamp', '$this->url')");

    }

    
/**
     * Borra a los usuarios en linea despues que se paso el tiempo limite de ellos
     *
     * @return  null;
     */
    
function delete_user()
    {
        
$query mysql_query("DELETE FROM useronline  WHERE timestamp < ($this->timestamp - $this->timeout)");

    }


    
/**
     * Cuenta la cantidad de usuarios en linea
     *
     * @return int
     */
    
function count_users()
    {
        
$result mysql_query("SELECT count(DISTINCT ip) FROM useronline ");

        
$count =  mysql_fetch_row($result);

        return 
$count[0];
    }

}
?>

Como Usarlo


Ya tenemos nuestra tabla para almacenar la info del usuario, tenemos nuestra clase para manejar la entrada de info del usuario y ahora como lo desplegamos en la pagina? facil

Codigo:
1
2
3
4
5
6
7
8
<?php
include("usersOnlineMain.php ");
$usersOnline = new usersOnlineMain();
$online number_format($usersOnline->count_users(),0,'.',',');

echo 
"<li>Usuarios en Linea: $online</li>";

?>