Introdução
Por padrão, o PHP armazena as sessões em arquivos no servidor. No entanto, quando trabalhamos com múltiplos servidores ou precisamos de mais controle sobre as sessões, armazená-las no banco de dados se torna a melhor opção.
Criando a tabela para armazenar sessões
Antes de configurar o PHP para salvar sessões no banco de dados, criamos uma tabela para armazenar as informações:
CREATE TABLE sessoes (
id VARCHAR(128) PRIMARY KEY,
dados TEXT NOT NULL,
ultima_atualizacao TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
Explicação da estrutura:
id
: Identificador único da sessão.dados
: Conteúdo da sessão armazenado em formato serializado.ultima_atualizacao
: Data e hora da última modificação na sessão.
Criando um manipulador de sessões personalizado
Agora, configuramos o PHP para usar esse banco de dados com uma classe personalizada:
class GerenciadorSessao {
private $pdo;
public function __construct($pdo) {
$this->pdo = $pdo;
session_set_save_handler(
[$this, 'abrir'],
[$this, 'fechar'],
[$this, 'ler'],
[$this, 'escrever'],
[$this, 'destruir'],
[$this, 'garbageCollector']
);
session_start();
}
public function abrir($savePath, $sessionName) {
return true;
}
public function fechar() {
return true;
}
public function ler($id) {
$stmt = $this->pdo->prepare('SELECT dados FROM sessoes WHERE id = :id');
$stmt->execute(['id' => $id]);
$sessao = $stmt->fetchColumn();
return $sessao ? $sessao : '';
}
public function escrever($id, $dados) {
$stmt = $this->pdo->prepare('REPLACE INTO sessoes (id, dados) VALUES (:id, :dados)');
return $stmt->execute(['id' => $id, 'dados' => $dados]);
}
public function destruir($id) {
$stmt = $this->pdo->prepare('DELETE FROM sessoes WHERE id = :id');
return $stmt->execute(['id' => $id]);
}
public function garbageCollector($maxlifetime) {
$stmt = $this->pdo->prepare('DELETE FROM sessoes WHERE ultima_atualizacao < (NOW() - INTERVAL :maxlifetime SECOND)');
return $stmt->execute(['maxlifetime' => $maxlifetime]);
}
}
Explicação do código:
ler()
: Recupera a sessão do banco de dados.escrever()
: Atualiza ou insere a sessão.destruir()
: Remove uma sessão específica.garbageCollector()
: Apaga sessões expiradas.
Conectando o gerenciador ao banco de dados
Agora, criamos a conexão e iniciamos o manipulador de sessão:
$pdo = new PDO('mysql:host=localhost;dbname=meubanco', 'usuario', 'senha');
new GerenciadorSessao($pdo);
Conclusão
Armazenar sessões no banco de dados no PHP permite maior escalabilidade, segurança e compatibilidade com múltiplos servidores. Essa abordagem garante que os dados das sessões sejam mantidos de forma mais confiável e centralizada.
Por que armazenar sessões no banco de dados no PHP é importante?
Em aplicações de grande porte ou sistemas distribuídos, armazenar sessões no banco de dados é fundamental. Quando utilizamos múltiplos servidores, a abordagem padrão baseada em arquivos pode gerar inconsistências, pois cada servidor pode armazenar sessões localmente, dificultando a sincronização.
Ao salvar sessões no banco de dados, garantimos que qualquer instância da aplicação possa acessar os mesmos dados do usuário, independentemente do servidor que esteja processando a requisição. Isso é particularmente útil em ambientes escaláveis, como aqueles que utilizam balanceadores de carga.
Além disso, essa abordagem permite maior controle sobre o tempo de expiração das sessões e facilita auditorias de segurança. Os dados podem ser encriptados antes do armazenamento para aumentar ainda mais a proteção.
Algumas aplicações:
- Permitir login contínuo em aplicações distribuídas.
- Garantir consistência de sessões em múltiplos servidores.
- Melhorar a segurança ao evitar sessões armazenadas em arquivos locais.
- Facilitar auditoria e monitoramento das sessões ativas.
Dicas para quem está começando
- Crie uma tabela específica para armazenar as sessões.
- Utilize
session_set_save_handler()
para gerenciar as sessões no banco de dados. - Evite armazenar dados sensíveis diretamente na sessão.
- Implemente um sistema de limpeza de sessões para evitar sobrecarga no banco.
- Utilize conexões seguras (PDO com SSL) para proteger os dados da sessão.
Contribuições de Gustavo Ferraz