Sub Session_OnEnd
Application("OnlineVisit") = Application("OnlineVisit") - 1
End Sub
Session_OnStart é
executada a cada vez que uma sessão é iniciada, o navegador é
"instanciado". A Session_OnEnd é executada a cada encerramento de sessão,
e isso pode ocorrer de 2 maneiras.
a)
Através de Session.Abandon. Se existe um botão "fim" e o
desenvolvimento foi correto, haverá uma "chamada" a Session.abandon. O
navegador será fechado, ou haverá redirecionamento para página padrão...
b)
Não ocorreu nenhum "request" nos últimos "n" minutos, sendo
"n" o valor de Session.TimeOut. É muito utilizado por questões de segurança,
e o valor padrão é 20 (minutos). Se o usuário simplesmente fechar o navegador
(como normalmente acontece), a sessão expirará pelo tempo, e Session_OnEnd será
executada.
Até aqui podemos saber, com uma pequena margem de erro (podemos até mesmo desconsiderar, uma vez
que o s servidor precisa tratar a sessão até sua expiração) o número de usuários
online, mas ainda não podemos saber QUEM são eles.
Esse é o segundo
ponto, e para isso vamos utilizar uma tabela de um banco de dados, lembrando que
não é necessariamente a melhor opção quanto à performance, mas sim quanto
ao entendimento, à didática.
Vamos identificar o
usuário pelo Session.SessionID, gerado a cada sessão. É um identificador único,
podendo ser utilizado como chave primária, diferente do IP, que pode ser
compartilhado. E ainda há a possibilidade, muito comum, de um mesmo usuário,
em uma mesma máquina, abrir o mesmo site várias vezes. Por essa razão, não
podemos utilizar o IP como identificador do usuário.
Essa tabela contará,
para nosso simples exemplo, com um campo SessionID (numérico), e outro
DtLastMov (Data&Hora).
Uma vez que o usuário
faça o acesso à primeira página (e isso deve ser tratado, pois o usuário já
tarimbado pode ir diretamente à página que deseja), seu SessionID deve ser
inserido, juntamente com a Data & Hora. A cada novo request (mudança de página
ou "submit" de formulário são casos típicos) o registro com seu SessionID
deve ser atualizado com now().
Uma vez que
Session_OnStart e Session_OnEnd nos informam o número de usuários online, se
fizermos um select to tipo...
sql = "SELECT TOP " & Application(OnlineVisit) & " * FROM
tabela ORDER BY DtLastMov DESC"
… saberemos
exatamente QUEM está online! Um campo IP pode ser utilizado ou USER (para sites
que cadastram usuários), ou mesmo a combinação de ambos. É possível saber
quem são os usuários logados e quem são os visitantes.
Se somarmos n
minutos, sendo n o valor de Session.TimeOut ao último movimento de cada usuário
podemos ter o tempo que cada um ficou online.
Vamos ver como
podemos trabalhar com soma e subtração em campo Data & Hora. Utilizaremos,
inicialmente, a função now()
Now() + 1 = Data&hora atual + 1 dia
Now() + (1/24) = Data&hora atual + 1 hora
Now() + (1/24/60) = Data&Hora atual + 1 minuto
Com
DateDiff("n", DataHora1, Datahora2) calculamos o intervalo, em minutos, de
duas variáveis "datahora". É importante que os segundos serão
desconsiderados. Por exemplo:
DateDiff("n",d1, d2) retornará 3.Uma vez calculado o
tempo individual, podemos obter facilmente a média (um pouco de matemática, não
mais ASP), além de detalhes como horas de maior tráfego e o que mais o
desenvolvedor achar por bem. É importante lembrarmos que o ASP é tão dinâmico
quanto nós pudermos ser. A limitação é nossa própria criatividade e
capacidade de analisar dados. O número máximo de visitantes já está sendo
tratado em Application("MaxCurrentVisit"), no Global.asa, e para que o
proposto acima funcione corretamente é necessário tratar cada movimento do usuário.
A utilização do Global.asa e as duas variáveis Application são suficiente
para saber quantos são os visitantes do momento. A implementação do QUEM tem
um certo custo e é necessário que cada movimento do usuário seja rastreado.
Você poderá, assim, tratar seus usuários cadastrados e visitantes...
Vimos com um bom nível
de detalhamento a teoria para a criação de um sistema monitor. Qualquer
esclarecimento maior, ou dúvida quanto à implementação, basta enviar-me um
e-mail.
Elildo Mancebo Reis
elildo@aspecto.net
www.aspecto.net
<< Volta para a lista de artigos