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); } } ?>
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.
Pergunta
Wanderson Camargo
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
Counter.php
<?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
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 CamargoLink para o comentário
Compartilhar em outros sites
0 respostass a esta questão
Posts Recomendados
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.