Ana Claudia

Programação e Design Web

Quem está online no meu site?

posted by Ana Claudia On novembro - 9 - 2008 1 COMMENT

Há algum tempo precisei criar um script em php para saber quem estava online (também conhecido como “Who’s online”) no momento num determinado site. Achei (infelizmente) o script em inglês e por isso motivo compartilho meus conhecimentos com vocês.
Nosso script fará 3 coisas:

  • Verificar se o visitante já está registrado
  • Se vai inserir um novo visitante ou atualizar um já existente
  • Remover todos os visitantes antigos que não estão mais online.

A primeira coisa que você deve fazer é criar uma tabela no seu banco de dados Mysql. Eu nomei minha tabela de usuarios_online com a seguinte estrutura:

1
2
3
4
5
6
7
8
9
CREATE TABLE usuarios_online (
  usuarios_online_id int(10) unsigned NOT NULL auto_increment,
  sessao_id varchar(128) default NULL,
  ip_address varchar(16) default NULL,
  hora_entrada varchar(14) default NULL,
  ultima_atividade varchar(14) default NULL,
  ultima_pagina_url varchar(255) default NULL,
  PRIMARY KEY  (usuarios_online_id)
);

Em seguida criamos o código da página whos_online que vai fazer todas as verificações necessárias

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
<?
include("conexao.php"); // Aqui você deve incluir a sua conexão com o banco de dados
function whos_online()
{
  //Pega os dados do visitante
   $session_id           = session_id();
   $ip_address          = $_SERVER['REMOTE_ADDR'];
   $ultima_pagina_url = $_SERVER['SCRIPT_NAME'];
   $hora_atual         = time();
   $xx_min_atras      = ($hora_atual - 900);
 
//Remove entradas que expiraram
   mysql_query("DELETE FROM usuarios_online WHERE hora_ultimo_click < '$xx_min_atras'") or die(mysql_error());
 
//Verifica se o visitante está online através da função session_id que verifica o id da sessão.
$rs = mysql_query("SELECT COUNT(*) as count FROM usuarios_online WHERE sessao_id = ' ".$session_id." ' ") or die(mysql_error());
if mysql_num_rows($rs) > 0) 
{
  $count = mysql_result($rs,0,0);
  if($count > 0) // Se o visitante já existir, atualiza seus dados na tabela
  {
      $sql= "UPDATE usuarios_online SET
      ip_address        = '$ip_address',
      hora_ultimo_click = '$hora_atual',
      ultima_pagina_url = '$ultima_pagina_url'
     WHERE sessao_id='$session_id'";
  }
  else // Se não, insere os dados do novo visitante
  {
       $sql= "INSERT INTO usuarios_online(
        clientes_id,
        nome_completo,
        ip_address,
        hora_ultimo_click,
        ultima_pagina_url,
        sessao_id,
        hora_entrada
        ) VALUES (
       '$clientes_id',
       '$nome_completo',
       '$ip_address',
       '$hora_atual',
       '$ultima_pagina_url',
       '$session_id',
       '$hora_atual'
       )";
     }
 
     mysql_query($sql);
}
whos_online(); // Chama a função whos_online()
?>

Para que o código acima seja executado, basta chamar a função na página em que deseja verificar quantos usuários estão online. O código está bem comentado e acho que não precisa de mais explicações. É importante salientar que um visitante é considerado um novo visitante a cada visita do site, ou seja, enquanto o navegador está aberto.
Agora a última coisa que precisamos é mostrar numa página no nosso controle quais são os usuários que estão online. Agora eu crio no meu painel de controle a página whos_online_listar.php para listar todos os visitantes que estão online no momento.

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
<?
 include("conexao.php"); // Novamente  você deve incluir a sua conexão com o banco de dados
 
$rs = mysql_query("SELECT  usuarios_online_id, ip_address,hora_entrada,
 hora_ultimo_click
 FROM  usuarios_online
 ORDER BY hora_ultimo_click DESC"); // Organizamos a hora do ultimo click do visitante em ordem decrescente.
?>
<table border="1">;
  <tr>
    <td>Online</td>
     <td>ID</td>
     <td>Endereço IP</td>
     <td.Entrada</td>
    <td>Último Click</td>
  </tr>
<?
 while($linha = mysql_fetch_array($rs))
{
     echo "<tr>\n";
     echo " <td>".gmdate('H:i:s',$tempo_online)."</td>\n";
     echo " <td>". $linha["usuarios_online_id"]."</td>\n";
     echo " <td>". $linha["ip_address"]."</td>\n";
     echo " <td>". date('H:i:s',$linha["hora_entrada"])."</td>\n";
     echo " <td>". date('H:i:s',$linha["hora_ultimo_click"])."</td>\n";
     echo "</tr>\n";
}
?>
</table>

Por hoje é só pessoal. Espero que a dica seja tão útil para vocês como foi para mim. Até a próxima :)

Categories: Mysql, PHP
Tags: , ,

One Comment

  1. Olá Ana Cláudia.
    Como é meu primeiro comentário, aproveito para parabenizá-la pelo blog, muito bom mesmo.
    Resolvi deixar uma sugestão, coloque uma função para gravar os usuarios online com o tempo de permanencia.
    Assim você pode gerar um relatório com quantidade de usuarios simultaneos em algum intervalo de tempo (dia, mes ou hora) e também estabelecer recordes de usuarios online.

    Sugestão de implementação simplificada: Insira na tabela a coluna “Ativo” como Boleano com Default True. Ao invez de deletar o registro, sete-o para False. Depois basta relacionar a nova coluna no Select.

    Obrigado por compartilhar seu conhecimento conosco.

Post a Comment

Your email is never published nor shared. Required fields are marked *

*
*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">

Comentários Recentes

  • Hugo: conseguir peço desculpas pra vc an
  • Hugo: podemos falar no msn se vc poder é
  • Hugo: vc quer todos os codigos? ou basta
  • Hugo: cara ana claudia estou adorando aqu
  • Ana Claudia: Gente havia um erro no script,no ar
  • Hugo: certo relamente errei feio salvei o