Fazer Script Contador de Usuários Online PHP

Já imaginou como seria um script PHP que exibisse o número total de usuários que estão online no teu website? Neste artigo vou mostrar uma ideia de script php que faz exatamente isso. O Script faz uso de banco de dados mysql e PDO. Para aprender como fazer script contador de usuários online php, continue lendo…

Banco de dados necessário

O script precisará guardar no banco de dados o IP e o horário do último acesso, para tanto, criei uma tabela chamada usuarios, veja:

1
2
3
4
5
6
7
8
--
-- Estrutura da tabela `usuarios`
--
 
CREATE TABLE IF NOT EXISTS `usuarios` (
  `ip` varchar(200) NOT NULL,
  `ultimo_acesso` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
-- Estrutura da tabela `usuarios`
--

CREATE TABLE IF NOT EXISTS `usuarios` (
  `ip` varchar(200) NOT NULL,
  `ultimo_acesso` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

A coluna IP irá guardar o IP dos visitantes
A coluna ultimo_acesso irá guardar a data e horário do último acesso do usuário

Fazer Script Contador de Usuários Online PHP

Veja o código do script abaixo:

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
<?php
 
require("config.php");
 
 
//Funções-----------------------------------
function anderson_makiyama_get_users_online(){
    
    global $conn;
    
    //Pega ip do usuario
    $ip = $_SERVER['REMOTE_ADDR'];
    //------------
    
    //Pega horário atual
    $horario = date("Y-m-d H:i:s");
    //------------
    
    //Insere ou atualiza o usuário atual que acessou a página
    
    $tb = $conn->prepare("select ip from usuarios where ip = :ip");
    $tb->bindParam(":ip", $ip, PDO::PARAM_STR);
    $tb->execute();
    $l = $tb->fetch(PDO::FETCH_ASSOC);
    $tb = null;
    
    //se o ip não existir no banco, adiciona-o
    if(empty($l)){
    
        $tb = $conn->prepare("insert into usuarios values(:ip,:horario)");
        $tb->bindParam(":ip",$ip, PDO::PARAM_STR);
        $tb->bindParam(":horario", $horario,PDO::PARAM_STR);
        $tb->execute();
        $tb = null;
    
    //se o ip já existir, atualiza a data de acesso e horario
    }else{
        
        $tb = $conn->prepare("update usuarios set ultimo_acesso=:horario where ip=:ip");
        $tb->bindParam(":ip",$ip, PDO::PARAM_STR);
        $tb->bindParam(":horario", $horario,PDO::PARAM_STR);
        $tb->execute();
        $tb = null;
        
    }
    //------------
    
    //Monta data há 40 segundos atrás
    $data = make_data_time(date('Y-m-d H:i:s'),0,0,0,0,0,-40);
    //------------------
    
    //Exclui usuarios inativos a mais de 40 segundos
    $tb = $conn->prepare("delete from usuarios where ultimo_acesso <:data");
    $tb->bindParam(":data", $data, PDO::PARAM_STR);
    $tb->execute();
    $tb = null;
    //-----------------------
    
    //Conta quantos usuarios existem e retorna o total
    $tb = $conn->query("select count(*) as total from usuarios");
    $tb->execute();
    $l = $tb->fetch(PDO::FETCH_ASSOC);
    $tb = null;
    //-----------------------
 
    return $l["total"];
    
}
 
function make_data_time($data, $anoConta,$mesConta,$diaConta,$horaConta,$minutoConta,$segundoConta){
    
   $ano = substr($data,0,4);
   $mes = substr($data,5,2);
   $dia = substr($data,8,2);
   $hora = substr($data,11,2);
   $minuto = substr($data,14,2);
   $segundo = substr($data,17,2);
   
   return date('Y-m-d H:i:s',mktime ($hora+($horaConta), $minuto+($minutoConta), $segundo+($segundoConta), $mes+($mesConta), $dia+($diaConta), $ano+($anoConta)));
   
}
?>
 
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
Existe(m) <strong> <?php echo anderson_makiyama_get_users_online() ?></strong> usuário(s) Online nos últimos 40 segundos
</body>
</html>
<?php

require("config.php");


//Funções-----------------------------------
function anderson_makiyama_get_users_online(){
	
	global $conn;
	
	//Pega ip do usuario
	$ip = $_SERVER['REMOTE_ADDR'];
	//------------
	
	//Pega horário atual
	$horario = date("Y-m-d H:i:s");
	//------------
	
	//Insere ou atualiza o usuário atual que acessou a página
	
	$tb = $conn->prepare("select ip from usuarios where ip = :ip");
	$tb->bindParam(":ip", $ip, PDO::PARAM_STR);
	$tb->execute();
	$l = $tb->fetch(PDO::FETCH_ASSOC);
	$tb = null;
	
	//se o ip não existir no banco, adiciona-o
	if(empty($l)){
	
		$tb = $conn->prepare("insert into usuarios values(:ip,:horario)");
		$tb->bindParam(":ip",$ip, PDO::PARAM_STR);
		$tb->bindParam(":horario", $horario,PDO::PARAM_STR);
		$tb->execute();
		$tb = null;
	
	//se o ip já existir, atualiza a data de acesso e horario
	}else{
		
		$tb = $conn->prepare("update usuarios set ultimo_acesso=:horario where ip=:ip");
		$tb->bindParam(":ip",$ip, PDO::PARAM_STR);
		$tb->bindParam(":horario", $horario,PDO::PARAM_STR);
		$tb->execute();
		$tb = null;
		
	}
	//------------
	
	//Monta data há 40 segundos atrás
	$data = make_data_time(date('Y-m-d H:i:s'),0,0,0,0,0,-40);
	//------------------
	
	//Exclui usuarios inativos a mais de 40 segundos
	$tb = $conn->prepare("delete from usuarios where ultimo_acesso <:data");
	$tb->bindParam(":data", $data, PDO::PARAM_STR);
	$tb->execute();
	$tb = null;
	//-----------------------
	
	//Conta quantos usuarios existem e retorna o total
	$tb = $conn->query("select count(*) as total from usuarios");
	$tb->execute();
	$l = $tb->fetch(PDO::FETCH_ASSOC);
    $tb = null;
	//-----------------------

	return $l["total"];
	
}

function make_data_time($data, $anoConta,$mesConta,$diaConta,$horaConta,$minutoConta,$segundoConta){
	
   $ano = substr($data,0,4);
   $mes = substr($data,5,2);
   $dia = substr($data,8,2);
   $hora = substr($data,11,2);
   $minuto = substr($data,14,2);
   $segundo = substr($data,17,2);
   
   return date('Y-m-d H:i:s',mktime ($hora+($horaConta), $minuto+($minutoConta), $segundo+($segundoConta), $mes+($mesConta), $dia+($diaConta), $ano+($anoConta)));
   
}
?>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
Existe(m) <strong> <?php echo anderson_makiyama_get_users_online() ?></strong> usuário(s) Online nos últimos 40 segundos
</body>
</html>

O Script acima inclui um arquivo de configuração com o seguinte código:

1
2
3
4
5
6
7
8
9
10
11
<?php
 
$nome_do_banco = "online"; 
$usuario_banco = "root";
$senha_banco = "";
$servidor_mysql = "localhost";
 
 
$conn = new PDO("mysql:host=".$servidor_mysql.";dbname=".$nome_do_banco,$usuario_banco,$senha_banco);
 
?>
<?php

$nome_do_banco = "online"; 
$usuario_banco = "root";
$senha_banco = "";
$servidor_mysql = "localhost";


$conn = new PDO("mysql:host=".$servidor_mysql.";dbname=".$nome_do_banco,$usuario_banco,$senha_banco);

?>

Se você não está acostumado com PDO, leia este artigo: PDO PHP Data Object

O Código acima possui comentários, mas o que é feito é o seguinte:

  1. É obtido o IP do usuário atual e também o horário atual
  2. É feito uma consulta no banco de dados pelo IP, caso encontrado, o horário do acesso é atualizado, caso contrário: o novo ip e o horário é inserido na tabela usuarios.
  3. É obtida a data há 40 segundos atrás
  4. São excluídos todos os registros com datas menores que a data há 40 segundos atrás
  5. Por fim, é efetuado uma contagem de registros (usuarios) online e o total é retornado pela função anderson_makiyama_get_users_online

O script faz uma de uma função chamada make_data_time que tem por objetivo montar datas no futuro e no passado, apenas passando o número de anos, meses, dias, hora, minuto ou segundo a incrementar ou decrementar da data passada como primeiro parâmetro.

Conclusão

Creio que com esta ideia você já poderá criar teus scripts contadores de usuários online facilmente. Claro que o script não sabe realmente se um dado usuário deixou o site ou apenas está inativo. Como por exemplo, o usuário pode ter aberto o teu site e estar lendo os emails dele. Então é certo dizer que o script lista os usuários ativos nos ultimos 40 segundos. Uma ideia alternativa seria criar um script javascript que fizesse uma conexão ajax com o teu site a cada 15 segundos, atualizando assim o horário do ultimo acesso do respectivo usuário. Com esta segunda ideia, mesmo que o visitante ficasse inativo, fosse tomar um café, ou ir ao banheiro, caso o site estivesse aberto no navegador web dele, ele continuaria sendo considerao um usuário online.

Fica a dica.

Até o próximo artigo aqui no blog

Leave a Reply