PHP 8.5.0 Released!

session_gc

(PHP 7 >= 7.1.0, PHP 8)

session_gcExecuta a coleta de lixo de dados da sessão

Descrição

session_gc(): int|false

Por padrão, o PHP usa session.gc_probability para executar o coletor de lixo da sessão probabilisticamente em cada requisição. Existem algumas limitações com essa abordagem:

  • Sites com baixo tráfego podem não ter seus dados de sessão excluídos dentro do período recomendado.
  • Em sites com alto tráfego, o coletor de lixo pode ser acionado com muita frequência, realizando trabalho extra desnecessário.
  • A coleta de lixo é realizada mediante solicitação do usuário, e o usuário pode experimentar um atraso.

Para sistemas de produção, recomenda-se desativar a coleta de lixo baseada em probabilidade, definindo session.gc_probability para 0 e acionar explicitamente o coletor de lixo periodicamente, por exemplo, usando "cron" em sistemas do tipo UNIX para executar um script que chama session_gc().

Nota: Ao chamar a função session_gc() a partir de um script PHP de linha de comando, a diretiva session.save_path deve ser definida para o mesmo valor das requisições web, e o script deve ter permissões de acesso e exclusão para os arquivos de sessão. Isso pode ser afetado pelo usuário que executa o script, e por recursos de contêiner ou "caixa de areia", como a opção PrivateTmp= do systemd.

Parâmetros

Esta função não possui parâmetros.

Valor Retornado

session_gc() retorna o número de dados de sessão excluídos em caso de sucesso, ou false em caso de falha.

Nota: Os manipuladores de salvamento de sessão antigos não retornam o número de dados de sessão excluídos, apenas um indicativo de sucesso ou falha. Se este for o caso, o número de dados de sessão excluídos se torna 1, independentemente dos dados realmente excluídos.

Exemplos

Exemplo #1 Exemplo de session_gc() para gerenciadores de tarefas como o cron

<?php
// Observação: Este script deve ser executado pelo mesmo usuário do processo do servidor web.

// É necessário ter uma sessão ativa para inicializar o acesso ao armazenamento de dados da sessão.
session_start();

// Executa a coleta de lixo (GC) imediatamente.
session_gc();

// Limpa o ID da sessão criado pelo session_start()
session_destroy();
?>

Exemplo #2 Exemplo de session_gc() para script acessível pelo usuário

<?php
// Observação: session_gc() é recomendado para ser usado por um script de gerenciador de tarefas, mas
// pode ser utilizado da forma abaixo.

// Usado para verificar o último horário de coleta de lixo (GC).
$gc_time = '/tmp/php_session_last_gc';
$gc_period = 1800;

session_start();
// Execute a coleta de lixo (GC) apenas quando o período de GC tiver decorrido.
// Ou seja, chamar session_gc() a cada solicitação é desperdício de recursos.
if (file_exists($gc_time)) {
if (
filemtime($gc_time) < time() - $gc_period) {
session_gc();
touch($gc_time);
}
} else {
touch($gc_time);
}
?>

Veja Também

adicionar nota

Notas de Usuários 2 notes

up
1
i dot carvallo at gmail dot com
11 months ago
Do not use:

if (session_gc() == false)
OR
if (!session_gc())

to evaluate if the garbage collector was triggered successfully since it also returns how many sessions it deleted, which can be 0 (and that evaluates to false with loose operators).

Sounds dumb, but it's a pitfall i fell into and it generated some confusion. Instead, use strict operator "===":

if (session_gc() === false)
up
0
ridaelkouri at gmail dot com
1 year ago
The session.gc() function does not seem to work alone. it deletes the data on the server but the data remains on the browser in the form of the cookie. the following code deletes the session files on the server but not on the browser. 

ini_set('session.gc_maxlifetime', 10);
ini_set('session.gc_probability', 1);
ini_set('session.gc_divisor', 1);

// Start the session
session_start();
$_SESSION['test'] = 'temporary data';

session_write_close();

// Wait for 15 seconds to ensure the session expires
sleep(15);

// Manually start the session again to trigger session handling
session_start();

session_gc();

// Check if the session data is still available
if (isset($_SESSION['test'])) {
    echo "Session is still active.";
} else {
    echo "Session expired and file deleted.";
}

but this code delete the session files on the server and also deletes the cookie as well as making the super global empty:

session_start();
$_SESSION['test'] = 'temporary data';

session_write_close();

// Wait for 15 seconds to ensure the session expires
sleep(15);

session_start();

// Manually trigger garbage collection
setcookie(session_name(), '', time() - 10);
$_SESSION = [];
session_gc();

// Check if the session data is still available
if (isset($_SESSION['test'])) {
    echo "Session is still active.";
} else {
    echo "Session expired and file deleted.";
}
To Top