PHP 8.5.0 RC 5 available for testing

session_gc

(PHP 7 >= 7.1.0, PHP 8)

session_gcEjecuta la recolección de basura de los datos de sesión

Descripción

session_gc(): int|false

Por omisión, PHP utiliza session.gc_probability para ejecutar el recolector de basura de sesión de forma probabilística en cada solicitud. Este enfoque presenta algunas limitaciones:

  • Es posible que sitios con poco tráfico no eliminen sus datos de sesión dentro del plazo preferido.
  • Sitios con mucho tráfico pueden hacer que el recolector de basura funcione con demasiada frecuencia, realizando trabajo extra innecesario.
  • La recolección de basura se realiza a petición del usuario, y este puede experimentar una demora.

Para sistemas de producción, se recomienda deshabilitar la recolección de basura basada en probabilidad configurando session.gc_probability en 0 y activar explícitamente el recolector de basura periódicamente, por ejemplo, utilizando "cron" en sistemas tipo UNIX para ejecutar un script que llame a session_gc().

Nota: Al llamar a session_gc() desde un script PHP de línea de comandos, session.save_path debe tener el mismo valor que las solicitudes web, y el script debe tener permisos de acceso y eliminación para los archivos de sesión. Esto puede verse afectado por el usuario con el que se ejecuta el script y por características de contenedor o aislamiento, como la opción PrivateTmp= de systemd.

Parámetros

Esta función no contiene ningún parámetro.

Valores devueltos

session_gc() devuelve el número de datos de sesión eliminados en caso de éxito, o false si ocurre un error.

Nota: Los antiguos gestores de almacenamiento de sesiones no devuelven el número de entradas de sesión eliminadas, sino solo un indicador de éxito/fracaso. En este caso, se devuelve 1 independientemente de cuántas entradas de sesión se hayan eliminado realmente.

Ejemplos

Ejemplo #1 Ejemplo de session_gc() para planificadores de tareas como cron

<?php
// Nota: Este script debe ser ejecutado por el mismo usuario que el proceso del servidor web.

// Requiere la activación de las sesiones para inicializar el acceso al gestor de almacenamiento de sesiones
session_start();

// Ejecutar la recolección de basura inmediatamente
session_gc();

// Eliminar el ID de sesión creado por session_start()
session_destroy();
?>

Ejemplo #2 Ejemplo de session_gc() para scripts accesibles por el usuario

<?php
// Nota: Se recomienda que session_gc() sea utilizado por un planificador de tareas,
// pero puede ser utilizado de la siguiente manera.

// Utilizado para verificar la hora del último uso de la recolección de basura
$gc_time = '/tmp/php_session_last_gc';
$gc_period = 1800;

session_start();
// Ejecutar la recolección de basura solo cuando haya transcurrido el período.
// Es decir, llamar a session_gc() en cada solicitud es un desperdicio de recursos.
if (file_exists($gc_time)) {
if (
filemtime($gc_time) < time() - $gc_period) {
session_gc();
touch($gc_time);
}
} else {
touch($gc_time);
}
?>

Ver también

add a note

User Contributed Notes 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