Detectar fechamento de browsers

714 views
Skip to first unread message

Tayron Miranda

unread,
Oct 28, 2014, 2:00:02 PM10/28/14
to php-b...@googlegroups.com
Boa tarde, criei um recurso onde gravo no banco um log de acesso de usuário.
Os dados são: Log.id, Log.user_id, Log.online (true or false), Log.created (datetime), Log.modified (datetime).

Com os dados acima posso saber quem está online, hora que acessou o sistema e a hora que saiu do sistema. (Coisa simples...)

Agora preciso detectar que o usuário está fechando a aba ou o navegador e antes que isso aconteça atualizar o log no banco. Alguém já fez algo parecido? 

--

      


Cassiano Ricardo Mourão

unread,
Oct 28, 2014, 2:07:16 PM10/28/14
to php-b...@googlegroups.com
Ja discutimos isso aqui bastante (ou em outra lista, não sei qual).
Eu já afirmei que método 100% confiável NÃO tem. Me contradisseram, solicitei um exemplo e até hoje espero. Tem uns bons meses isso já...
A forma melhor que tem é, das duas uma: ou você trabalha com polling ou comet/push. Porquê disparar um evento (onunload/onbeforeunload e afins) só consegui colocar pra abrir o alert() ou a janela de confirmação.

--
Você recebeu essa mensagem porque está inscrito no grupo "php-brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para php-brasil+...@googlegroups.com.
Para postar nesse grupo, envie um e-mail para php-b...@googlegroups.com.
Acesse esse grupo em http://groups.google.com/group/php-brasil.
Para mais opções, acesse https://groups.google.com/d/optout.

Jean Rafael Tardem Delefrati

unread,
Oct 28, 2014, 2:52:45 PM10/28/14
to php-b...@googlegroups.com
Você pode tentar pegar o fechamento da sessão, tem umas funções bem interessantes aqui:

http://php.net/manual/pt_BR/function.session-set-save-handler.php (a versão em português está com tradução automática, está melhor em inglês: http://php.net/manual/en/function.session-set-save-handler.php)

Entre os exemplos tem uma forma de gravar as sessões em arquivos ou até em banco de dados e executar códigos no destroy da sessão ou no garbage collector.

Abraço

Erick Engelhardt

unread,
Oct 28, 2014, 3:10:39 PM10/28/14
to php-b...@googlegroups.com
acho que a mais fácil é um setinterval sendo executado no browser do cliente com uma requisição ajax atualizando o campo last_ping ou qqer coisa parecida.
Erick Engelhardt 
21 94631994


Edinei L. Cipriani

unread,
Oct 28, 2014, 3:18:43 PM10/28/14
to php-b...@googlegroups.com
Sessão não serve para isso.

Sessão tem um tempo de vida, e esse tempo de vida só é renovado com um novo session start, se ele n conseguir renovar o PHP vai criar uma nova sessão.

Se o usuário  ficar ocioso  na página por mais tempo q o tempo de vida da sessão, a sessão será destruída.

Att,
Edinei L. Cipriani
Desenvolvimento de sites, sistemas,  jogos e aplicativos cross plataforma
Evangelist cakePHP, nodeJS, jQuery, AngularJS, Bootstrap e Corona SDK
Criador do BS Sites - Um plataforma de criação de sites dinâmicos e responsivos sem a necessidade de saber programar.
http://bssites.com.br

Vinicius Luiz

unread,
Oct 28, 2014, 3:29:06 PM10/28/14
to php-b...@googlegroups.com

O mais comum que já vi foi abrir a app em um popup daí, caso seja fechado, você consegue detectar isso de imediato..

Rafael Pouzada

unread,
Oct 28, 2014, 3:51:22 PM10/28/14
to php-b...@googlegroups.com
Fala Tayron,

Tive uma necessidade parecida com a sua e só consegui resolver com jquery. Como disse o Cassiano, 100% não vai ser, mas quebra um galho.

Dá uma olhada nesse exemplo http://jsfiddle.net/4cy92xpL/5/

Att.:

   "name": "Rafael Machado Pouzada", 

   "job": "Web Developer", 

   "website": "www.pouzada.com.br

}

Linux User: #549652




From: jeande...@gmail.com
Date: Tue, 28 Oct 2014 16:52:21 -0200
Subject: Re: [php-brasil] Detectar fechamento de browsers
To: php-b...@googlegroups.com

Tayron Miranda

unread,
Oct 29, 2014, 6:30:39 AM10/29/14
to php-b...@googlegroups.com
Bom dia Rafael,
Dei uma olhada no seu exemplo e como outros que já testei, caso o usuário dê um refresh na página o evento é disparado.. no meu caso seria somente quando o usuário fechar aba e/ou o navegador.. não sei bem o que vu fazer em relação à isso, como todos tem afirmado (  ou quase todos ) não há uma solução 100% segura, talves eu deva apenas tratar e informar que o usuário X fechou o navegador ou algo parecido..

      


Cassiano Ricardo Mourão

unread,
Oct 29, 2014, 6:59:46 AM10/29/14
to php-b...@googlegroups.com
Já disse man, polling ou comet. O overhead é pouco... E a margem vai depender do intervalo que você utilizar.

Diego Pires

unread,
Oct 29, 2014, 7:17:55 AM10/29/14
to php-b...@googlegroups.com
Você tentou algo com a dica que o Jean deu?

MasterOrc BOT

unread,
Oct 29, 2014, 4:02:39 PM10/29/14
to php-b...@googlegroups.com
Olha, no meu caso, eu fiz o seguinte.

No(s) arquivo(s) em que a pessoa vai fechar, insiro esse Jquery

<script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script>
<script type="text/javascript">
$
(window).unload(function(){
    $
.ajax({
        type
: 'POST',
        url
: 'ipleave.php',
        async
:false,
        data
: {id:"<?php echo $idgravado ?>"}
   
});
});
</script>





Ou seja, no evento uload (fechando a janela) ele manda uma requisição POST via ajax para um arquivo chamado ipleave.php, assíncronas (saiba mais sobre sincronização em http://blognti.wordpress.com/2010/07/28/requisicoes-ajax-sincronas-e-assincronas-em-jquery/ ), enviando apenas uma variavel (no caso a id), que é o idgravado, esse idgravado nada mais é que o IP da pessoa que entrou naquela janela, no seu caso vc vai passar os dados da SESSION, ou sei la onde vc guarda esses dados.

No arquivo  ipleave.php, ele vai receber esses dados via POST, com isso vc pode gravar no banco de dados o que recebeu, no meu caso eu gravo o $_POST['id']
e date('H:i:s d-m-Y').

Tayron Miranda

unread,
Oct 30, 2014, 6:31:30 AM10/30/14
to php-b...@googlegroups.com
Bom, obrigado à todos pelas dicas e comentários e etc... 

Resolvi o problema fazendo requisições ao servidor atualizando a data e hora na tabela de log, pois como tenho a data em que ele logou e saiu do sistema, fico de 3 em 3 segundos atualizando a data de saida.. paralelo à isso também fico verificando quem no log está com a data de saída maior que 4 segundos em relação à data atual.. caso isso aconteça é que o usuário fechou o navegador, a luz acabou, ele fechou aba.. e atualizo seu status para offline.

Se o usuário feche a aba e o status dele muda para offline, ao abrir o site novamente, ele continuará logado, com isso na hora de atualizar a data dele, o status dele muda para online.. 

Pontos negativos disso é que são feitas 2 requisições ajax para atualizar a data e status do usuário no banco.
E na tela de listar os usuários (na tela de log), fico atualizando a listagem via ajax e com isso coloquei o tempo em que ele ficou online (horas) e essa hora ela é atualizada em tempo real (com delay de 3 segundos rsrsr).

Em fim, solução para essa budega foi fazer requisições ajax ao servidor.. ( Putz escrevi demais, tenho até preguiça de voltar e revisar esse testamento... ¬¬ )

--
Você recebeu essa mensagem porque está inscrito no grupo "php-brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para php-brasil+...@googlegroups.com.
Para postar nesse grupo, envie um e-mail para php-b...@googlegroups.com.
Acesse esse grupo em http://groups.google.com/group/php-brasil.
Para mais opções, acesse https://groups.google.com/d/optout.



--

      


Erick Engelhardt

unread,
Oct 30, 2014, 7:33:57 AM10/30/14
to php-b...@googlegroups.com
Já tentei outras alternativas, mas essa foi a única que resolveu. Só fique de olhos da capacidade do seu servidor. Pq se 1000 clientes ficarem online, com timer de 3 segundos, serão 333 conexões simultâneas médias (vamos arredondar só para ficar teórico).

Se for mais do que isso, você vai precisar aumentar o tempo. O que não é problema algum dependendo da aplicação. Enfim, monitore o uso de processamento, memória, disco e simule seus clientes conectados.
Erick Engelhardt 
21 94631994


Tayron Miranda

unread,
Oct 30, 2014, 7:37:04 AM10/30/14
to php-b...@googlegroups.com
Esse sistema vai ter poucos usuários, o servidor aqui da empresa é bom também, pois só entidades como prefeituras e câmaras acessará o sistema e talvez alguns funcionários deles.. Mas sim, ficarei de olho no processamento do sistema caso haja algum problema... 

Cassiano Ricardo Mourão

unread,
Oct 30, 2014, 7:53:57 AM10/30/14
to php-b...@googlegroups.com
O nome disso é polling...
Se começar a gerar overhead, utilize comet como já disse.
Sobre a segunda requisição para mudar o status, não creio que seja necessária...

Tayron Miranda

unread,
Oct 30, 2014, 7:59:02 AM10/30/14
to php-b...@googlegroups.com
Cassiano, valeu pela dica, não sabia muito sobre o que seria o "polling", mas sim a segunda requisição foi fundamental para eu saber o estado do usuário em tempo real.. 
Reply all
Reply to author
Forward
0 new messages