Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

gambas

Fecho de sessão

Mensagens Recomendadas

gambas

Boas...

Queria fazer um script que me mostrasse os utilizadores online... e ja tenho uma ideia +/- definida, basta-me utilizar um campo na base de dados e assim que o utilizador faz login o campo muda para 1 e se sair para 0.

o problema é que quando o utilizador fecha o browser as variaveis de sessão podem 'evaporar-se' ou quando o utilizador quiser limpar os dados de sessão.

Como resolvo o problema? enquanto escrevia este post ocorreu-me as cookies (solução? ou nem por isso?!)...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Antimatéria

Podes usar flags com timers, sempre que um user pede uma informação ao site a flag passa para 1, se por exemplo esse user não requisitar nada durante 5min a flag passa para 0 e ele fica como offline.

É capaz de não ser a melhor opção, mas é um script independente do utilizador desligar o browser lol


#include <stdio.h>main(){  printf("Hello World");}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Antimatéria

flags não são nada mais que variáveis, ints, bools, etc

Quando o utilizador, muda de página, faz download de um documento, ou faz um post no forum, isso são tudo chamadas ao servidor, sempre que o user faz uma chamada renovas a flag, se o tempo expirar, metes a flag a 0 ou false (ou outro valor que indique que o user está offline)


#include <stdio.h>main(){  printf("Hello World");}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
scorch

Mas faz isso com timers em JavaScript, e não só quando o utilizador muda de página. Porque um utilizador pode estar numa página, online, mas não a recarregar à x tempo.


scorch_pp.png

PS: Não respondo a perguntas por mensagem que podem ser respondidas no fórum.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
scorch

1º É pá, nem metas de um em um segundo. Coitado do utilizador, sempre a enviar e receber requests. :)

2º Não precisas de manipular cookies em JavaScript. Fazes uma request AJAX de cinco em cinco minutos a um ficheiro PHP, e ele trata do resto.


scorch_pp.png

PS: Não respondo a perguntas por mensagem que podem ser respondidas no fórum.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
gambas

pois mas a minha ideia é...

o utilizador faz login...

caso o login ocorra com sucesso eu crio uma cookie com o valor do id de utilizador...

depois em cada pagina verifico se a cookie de id do utilizador existe, no caso de existir ele vai a base de dados e mete o campo online a 1 ... mas mesmo com request AJAX com intervalo de 5 min, imaginemos que o tempo de cookie expira durante um intervalo esse intervalo de 5 min... e o utilizador fecha o browser... a cookie ja nao existe(pk expirou!) e o campo online fica sempre a 1 e eu nao vou conseguir mete-lo a 0 pk o valor de id 'foi-se'...

nao sei se me faço entender... mas era esta a minha ideia e o meu grande problema...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
scorch

Tens de ter um um campo na BD a dizer: LastResquest ou parecido. Depois no servidor, colocas um script a correr de 15 em 15 minutos. E esse script verifica se o LastRequest foi à mais de 5 minutos. Se tiver sido, coloca online a zero.


scorch_pp.png

PS: Não respondo a perguntas por mensagem que podem ser respondidas no fórum.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
gambas

podias dar o codigo? é que nao tou a ver como faço isso... nao costumo muito trabalhar com datas...

queres tu dizer que o campo LastRequest é do tipo data entao eu vou verificar se já passaram 5 minutos daquela data e terei que meter todos os utilizador no campo online a 0 (apenas os que passaram 5 min)? certo?...  nao consigo especificar o utilizador pk o id ja nao la esta, tera que ser naqueles que se verifique esta situacao... é isto?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mjamado

Boas, gambas.

Olha, é absolutamente necessário que o indicador de online esteja guardado na mesma tabela dos utilizadores?

Podias criar uma tabela do tipo MEMORY, visto que os dados não precisam de ser persistentes (no caso do servidor crashar) e é muito mais rápida.

Nessa tabela, só precisas dos campos id de utilizador e último request (é um campo do tipo DATETIME), tal como disse o scorch. Adicionalmente, podes ter também o nome do canal onde ele está, dá sempre jeito para fazer uns truques engraçados na apresentação. Tipo isto (o campo com * é a chave primária):

[utilizadores_on]
utilizador_id* (INT)
ult_request (DATETIME)
canal (VARCHAR)

Depois, a cada request que um utilizador faça, tens de fazer três coisas:

1. Inserir ou alterar a linha dessa tabela onde esteja o id do utilizador, para colocar o DATETIME do request. Podes fazer isso com a instrução:

INSERT INTO utilizadores_on
SET utilizador_id = $id,
    ult_request = NOW()
ON DUPLICATE KEY UPDATE ult_request = NOW();

2. Limpar todas as linhas com uma diferença temporal superior à especificada (basicamente, é pessoal que já não está online). Qualquer coisa como:

DELETE FROM utilizadores_on
WHERE ult_pedido < DATE_SUB(NOW(), INTERVAL 5 MINUTE);

3. Puxar para a visualização todos os utilizadores que ainda constam da tabela, podendo até fazeres logo o LEFT JOIN à tabela dos utilizadores propriamente ditos para trazer os nomes e que mais dados quiseres de lá.

Sem grandes confusões, tens a coisa a funcionar; sem pedidos via AJAX, sem crons de limpeza, sem grandes malabarismos...

Se o utilizador sair explicitamente (se fizer logout), limpas logo da tabela.


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
gambas

e diz-me uma coisa é esta a metodologia que um joomla usa (por exemplo)?...

gostei da ideia de ter apenas uma tabela para este caso... e, claro, não é necessário que o campo online esteja na mesma tabela de utilizadores...

ok entao simplesmente sempre que o utilizador fizer um request corro estas 3 instruções?

e é logico que a instrucao 1 só a corro se houver a tal cookie de id com algo, certo?

so mais uma coisa o que queres dizer com ON DUPLICATE KEY UPDATE ??? se houver um id repetido apenas vai actualizar o campo de ult_request? sei mt pouco de bases de dados...

desde ja o meu muito obrigado scorch e mjamado...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
mjamado

Não sei se é usado pelo Joomla - na realidade, não sei se é usado por qualquer CMS, que eu fujo delas a sete pés. Acho que o motor de fórum vBulletin usa um esquema semelhante, mas já não estou recordado bem ao certo.

Sinceramente, gosto pouco de cookies de forma recorrente. Eu preferia usar a $_SESSION, mas duma maneira ou de outra, sim, só corres a primeira instrução se o request tiver vindo dum utilizador efectivamente logado.

O ON DUPLICATE KEY UPDATE é uma pequena maravilha do MySQL: se tentasses fazer o INSERT só por si e na tabela já existisse esse id de utilizador, daria erro; o ON DUPLICATE KEY UPDATE, em vez de dar erro, executa as instruções seguintes - basicamente, é actualizar o campo ult_request do id que já lá está.


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Partilhar esta mensagem


Ligação 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

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.