Configurando sessões para serem armazenadas no banco de dados no PHP

Passo a passo para configurar sessões no PHP utilizando banco de dados para garantir persistência e segurança.

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.

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

Compartilhe este tutorial: Como configurar sessões para serem armazenadas no banco de dados no PHP?

Compartilhe este tutorial

Continue aprendendo:

Como compartilhar sessões entre diferentes subdomínios no PHP?

Método eficiente para compartilhar sessões entre subdomínios no PHP e manter o usuário autenticado em toda a aplicação.

Tutorial anterior

Como usar sessões com cookies ativados e desativados no PHP?

Técnicas para configurar sessões no PHP para funcionar com ou sem cookies, garantindo suporte a todos os usuários.

Próximo tutorial