PHP, Sessões · 2 min read · Dec 27, 2025
Os dados da sessão PHP não são excluídos ao usar gerenciamento de sessão personalizado no debian (e ubuntu)
Nos sistemas debian (pelo que sei, isso se aplica ao ubuntu também) o coletor de lixo para sessões PHP está desativado por padrão.
A configuração correspondente no php.ini é session.gc_probability = 0 que ativa o coletor de lixo quando definido como algo maior que zero. O valor padrão no PHP é 1, então o coletor de lixo é chamado com uma probabilidade de 1/100 a cada chamada de script PHP.
Nos sistemas debian, essa configuração está desativada devido ao fato de que o caminho padrão para o armazenamento de sessões não é gravável pelo processo do servidor web (e não deveria ser também). A exclusão de arquivos de sessão desatualizados é feita por um cron job do sistema aqui.
Seguindo um trecho do php.ini:
; Isso está desativado nos pacotes Debian, devido às permissões estritas
; em /var/lib/php5. Em vez de definir isso aqui, veja o cronjob em
; /etc/cron.d/php5, que usa a configuração session.gc_maxlifetime abaixo.
; scripts php que usam seu próprio session.save_path devem garantir que a coleta de
; lixo esteja habilitada definindo session.gc_probability
;session.gc_probability = 0Como essa configuração é adequada para scripts que usam o gerenciamento de sessão padrão do php (arquivo), isso pode levar a problemas quando você usa seu próprio gerenciamento de sessão que define suas próprias rotinas para leitura e gravação de sessão usando session_save_handler(). Essas classes de gerenciamento de sessão fornecerão uma própria função para o coletor de lixo, também na maioria dos casos.
O problema é que essa função do coletor de lixo nunca será chamada em um sistema debian com a configuração php.ini mencionada acima. Isso é crucial, quando os dados da sessão são armazenados em um banco de dados MySQL do tipo MEMORY. Esta tabela é limitada em tamanho pelo valor de configuração do MySQL max_heap_table_size. Se esse tamanho for atingido, todas as gravações de sessão subsequentes falharão e, com isso, provavelmente o site deixará de funcionar corretamente.
Sabendo disso, é realmente importante sobrescrever a configuração php.ini para a coleta de lixo em sua própria classe de gerenciamento de sessão. Eu vou mostrar isso com um pequeno exemplo de uma classe de gerenciamento de sessão (sem escrita/leitura real):
class session {
function __destruct() {
session_write_close();
}
function __construct() {
@ini_set("session.use_trans_sid","0");
@ini_set('session.gc_probability', 1); // no debian isso está desativado por padrão...
// habilitar funções de manipulador de sessão personalizadas
session_set_save_handler(array(&$this,"_sess_open"),
array(&$this,"_sess_close"),
array(&$this,"_sess_read"),
array(&$this,"_sess_write"),
array(&$this,"_sess_destroy"),
array(&$this,"_sess_gc"));
@session_start();
}
// declarar funções de manipulador de sessão definidas pelo usuário
function _sess_open($sSavePath, $sSessionName) {
return true;
}
function _sess_close() {
return true;
}
function _sess_read($sKey) {
// ler e retornar valor
}
function _sess_write($sKey, $val) {
// escrever novo valor
}
function _sess_destroy($sKey) {
// destruir sessão
}
function _sess_gc($iMaxLifeTime) {
// excluir sessões antigas (do db)
}
}
$mySession = new session();A coisa importante é a chamada de @ini_set(‘session.gc_probability’, 1) dentro do construtor. Depois disso, a coleta de lixo da sessão deve funcionar como esperado, mesmo em sistemas debian com sua própria classe de gerenciamento de sessão.
Receba novas postagens na sua caixa de entrada
Sem spam. Cancele a assinatura a qualquer momento.