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
novembro 11, 2008 às 7:10 am
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.