• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Weasel

[PHP]Useronline [Conta a quantidade de utilizadores online]

17 mensagens neste tópico

Aqui vái uma maneira simples de contar as pessoas que estão online no nosso website (Usando PHP+Mysql)

usersonline.php

<?
//Tempo para contar os users online (tempo medio para contagem dos users) em segundos
$timeoutseconds = 600;

//Tempo neste momento
$timestamp = time();

//Hora a que esgota o estado "Online" do user
$timeout = $timestamp-$timeoutseconds;

//Ligaçao a base de dados
mysql_connect($server, $db_user, $db_pass);
mysql_select_db($database);

//PASSA AS VARIAVEIS OBTIDAS DO SERVIDOR PARA VARS "LOCAIS"
$R_ADDR = $_SERVER['REMOTE_ADDR'];
$P_SELF = $_SERVER['PHP_SELF'];

//Insere o IP e o Tempo actual na base de dados para verificação postrior
$insert_u = mysql_query("INSERT INTO useronline VALUES ('$timestamp','$R_ADDR','$P_SELF')");

//Apaga os IP's da base de dados cujo tempo de inatividade ja expirou
$delete_u = mysql_query("DELETE FROM useronline WHERE timestamp<$timeout");

//Lista os Users que estão de facto online e activos nos ultimos 5 minutos
$result = mysql_query("SELECT DISTINCT ip FROM useronline");

//variavel com o numero de users online
$total_users = mysql_num_rows($result);

//fecha a ligaçao ao Mysql
mysql_close();
?> 

Em todos os ficheiros que queiras que seja feita a contagem deves colocar

 include("usersonline.php"); 

Para mostrar o valor de users online:

echo "Users online: ". $total_users;

A Tabela terá que ter o seguinte formato

#
# Estrutura da tabela `useronline`
#

CREATE TABLE `useronline` (
  `timestamp` int(15) NOT NULL default '0',
  `ip` varchar(40) NOT NULL default '',
  `file` varchar(50) NOT NULL default '',
  PRIMARY KEY  (`timestamp`),
  KEY `ip` (`ip`,`file`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

Done ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

o $timeout não deverá ser $timestamp mais $timeoutseconds em vez de menos?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Estás a usar register_globals.

É preferível não as ter activas e usar:

//Insere o IP e o Tempo actual na base de dados para verificação postrior
$insert_u = mysql_query("INSERT INTO useronline VALUES ('$timestamp','$_SERVER['REMOTE_ADDR']','$_SERVER['PHP_SELF']')");

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem algum tmepo que procura um coisas destas mas nunca me tinha saido nada da tola :thumbsup: . Mas não deveria ser + como o marinherio diz?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

o $timeout não deverá ser $timestamp mais $timeoutseconds em vez de menos?

Sim, tens razão :thumbsup:
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem já fiz este código há mesmo muuito tempo, mas tenho a ideia que funciona bem, secalhar hoje não fazia assim....

Quanto ao Global vars, sim têm toda a razão corrige-se já :P

O Timeout é mesmo assim, testem o código e digam de vossa justiça :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Quanto ao timeout, tens razão, estás a apagar todos os registos de visitas efectuadas há mais de 600 segundos (10 mins) atrás. :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

esse script não é muito intensivo pa bd knd é utilizada por mts users???

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

esse script não é muito intensivo pa bd knd é utilizada por mts users???

Sim.. de facto é realmente pesado! :(

Eu continuo a achar que é timestamp + timeout.

é a hora que te logas-te mais x minutos.

Depois tens que verificar se o timestamp actual já passou o valor do timeout e se já passar então já estás off .

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

esse script não é muito intensivo pa bd knd é utilizada por mts users???

Sim.. de facto é realmente pesado! :(

Eu continuo a achar que é timestamp + timeout.

é a hora que te logas-te mais x minutos.

Depois tens que verificar se o timestamp actual já passou o valor do timeout e se já passar então já estás off .

Não percebeste a lógica do script. O objectivo é sempre que visitares o site, pôr um user online. Se, quando outro vier, e este não estiver lá à mais de 600 segundos (10 minutos), esse user é removido da bd.
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pesado? Acham ? Já o tive num site que rondava a média de 20 users online (pouquitos) nunca testei com muitos (leia-se de 100 para cima)....

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pesado? Acham ? Já o tive num site que rondava a média de 20 users online (pouquitos) nunca testei com muitos (leia-se de 100 para cima)....

20 utilizadores não chegam para testar a fiabilidade do script.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Assim fazes uma quantidade brutal de pedidos à base de dados.

Insere cada utilizador que chegue na base de dados, um timestamp e o seu username ( não o id ) e guarda uma variavel na sessão para saberes que esse utilizador já está inserido na tabela dos utilizadores online. Assim evitas essa quantidade butal de queries.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Assim fazes uma quantidade brutal de pedidos à base de dados.

Insere cada utilizador que chegue na base de dados, um timestamp e o seu username ( não o id ) e guarda uma variavel na sessão para saberes que esse utilizador já está inserido na tabela dos utilizadores online. Assim evitas essa quantidade butal de queries.

Se estamos a falar de "guests" não podemos falar em usernames....mas sim percebi a ideia, este código já está muito velhinho....tenho de alterar isto.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Assim fazes uma quantidade brutal de pedidos à base de dados.

Insere cada utilizador que chegue na base de dados, um timestamp e o seu username ( não o id ) e guarda uma variavel na sessão para saberes que esse utilizador já está inserido na tabela dos utilizadores online. Assim evitas essa quantidade butal de queries.

Se estamos a falar de "guests" não podemos falar em usernames....mas sim percebi a ideia, este código já está muito velhinho....tenho de alterar isto.

Usas a session_id em vez do username...
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Agora estive a olhar com olhos de ver para o que o pedrotuga disse, e não percebi, para quê a variavel de sessão ?

Em que é que isso vai fazer com que eu necessite de fazer menos querys á db ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora