Ir para conteúdo
Fórum Script Brasil
  • 0

Contador de Usuários Online para PostgreSQL


Wanderson Camargo

Pergunta

Olá!

Há alguns dias foi solicitado um script para visualização de quantos usuários online temos em um site qualquer. Eu tinha algumas idéias para o desenvolvimento e hoje resolvi colocar ele para funcionar. Desenvolvi esta classe para trabalhar com PostgreSQL. Pois bem, a lógica é muito simples:

1) Criamos uma tabela no banco para controle dos usuários;

A tabela criada é muito simples, mas possui uma habilidade especial: somente registra um usuário por vez, impossibilitando duplicações; ou seja, ela faz o trabalho sujo do script que deveria verificar se já existe um usuário online para não registrar duas vezes o mesmo. Com isto existe um campo configurado para ser único.

2) Desenvolvemos uma classe que consiga trabalhar com esta tabela.

Esta classe conecta com o banco e registra a ID da sessão atual no servidor tratando situações conforme necessário. Os objetos desta classe devem estar entre brackets try...catch conforme o exemplo. Para criar o objeto basta informar dados para a conexão ao banco.

O arquivo tabela.sql é a query que deve ser executada no servidor PostgreSQL para criar a tabela necessária.

tabela.sql


CREATE TABLE users (
id SERIAL PRIMARY KEY,
session CHAR(32) NOT NULL UNIQUE,
update TIMESTAMP NOT NULL
);
[/codebox]

Counter.php

[codebox]
<?php
/**
* Classe Counter
* Contadora de usuários online
* @author Wanderson Camargo
*/
class Counter {
private $db;
private $lifeTime;
private $sid;

/**
* Construtor da Classe Counter
* @param $user String Nome do usuário no banco de dados
* @param $password String Senha do usuário no banco de dados
* @param $dbname String Nome do banco de dados
* @param $host String[optional] Endereço do servidor
*/
public function __construct($user,$password,$dbname,$host="localhost") {
$resource = @pg_connect("host=$host dbname=$dbname user=$user password=$password");
if(!$resource)
throw new Exception("Erro ao conectar ao servidor.");
$this->db = $resource;
if(!isset($_SESSION)) {
session_name('contador');
session_set_cookie_params($this->lifeTime);
session_start();
}
$this->sid = session_id();
$this->lifeTime = 300;
}

/**
* setLifeTime Configura o tempo da conexão ao site
* @return void
* @param $lifeTime Object
*/
public function setLifeTime($lifeTime) {
$lifeTime = (int)$lifeTime;
if($lifeTime <= 0)
throw new Exception("Tempo de vida deve ser maior que zero.");
$this->lifeTime = $lifeTime;
}

/**
* counter Conta quantos usuários estão online
* @return int Número de usuários online
*/
public function counter() {
$last = date("Y-m-d H:i:s",time()-$this->lifeTime);
$sql = "DELETE FROM users WHERE update < '$last';";
@pg_query($this->db,$sql);
$sid = $this->sid;
$now = date("Y-m-d H:i:s");
$sql = "INSERT INTO users(session,update) VALUES ('$sid','$now');";
@pg_query($this->db,$sql);
$sql = "SELECT COUNT(session) as counter FROM users;";
$usuarios = @pg_fetch_array(@pg_query($this->db,$sql));
return $usuarios = (int)$usuarios['counter'];
}

/**
* toString Retorna uma string com o número de usuários online
* @return String Número de usuários online
*/
public function __toString() {
return (string)$this->counter();
}

/**
* Destruidor da Classe Counter
*/
public function __destruct() {
@pg_close($this->db);
}
}
?>

exemplo.php


<?php
include 'Counter.php';
try {
$contador = new Counter('usuario','senha','nomeDoBanco');
$contador->setLifeTime(360); //360 segundos
}
catch(Exception $e) {
$contador = 0;
}
?>
<?php echo $contador; ?> online!
[/codebox]

Próxima Versão: Estudaremos alguns métodos para que possamos criar uma classe que trabalhe com qualquer banco de dados e não somente PG, ou simplesmente criar uma classe abstrata para adicionar mais códigos do que o necessário. Todavia, esta classe é um passo para estudo de códigos mais avançados.

Espero ter ajudado.

Editado por Wanderson Camargo
Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      651,8k
×
×
  • Criar Novo...