Quem está online no meu site?
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


