PHP 8.4.2 Released!

session_gc

(PHP 7 >= 7.1.0, PHP 8)

session_gcRealizar una recolección de basura de datos de sesión

Descripción

session_gc(): int

session_gc() se emplea para la RB (recolección de basura) de datos de sesión. PHP hace la RC de sesiones basada en probabilidad de forma predeterminada.

LA RB basada en probabilidad funciona en cierto modo aunque tiene algunos problemas. 1) Los datos de sesión de sitios con tráfico bajo podrían no borrarse con la frecuencia requerida. 2) Los sitios con tráfico alto podrían tener una RB demasiado frecuente. 3) La RB se realiza durante la petición del usuario, por lo que este podría experimentar un retraso en la RB.

Por tanto, se recomienda ejecutar la RB periódicamente para sistemas en produción. P.ej., use "cron" para sistemas como UNIX. Asegúrese de inhabilitar la RB basada en probabilidad estableciendo session.gc_probability a 0.

Valores devueltos

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

Los manejadores de guardado antiguos no devuelven el número de datos de sesión eliminados, sino solamente el indicador de éxito/fallo. Si este es el caso, el número de datos de sesión eliminados será 1, sin considerar los datos realmente eliminados.

Ejemplos

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

<?php
// Nota: Este scriptr debería ejecutarse por el mismo usuario del proceso del servidor web.

// Es necesario una sesión activa para inicializar el accesso al almacén de datos de sesión.
session_start();

// Ejecutar la RB inmediatamente
session_gc();

// Limpiar el ID de sesión creado por session_gc()
session_destroy();
?>

Ejemplo #2 Ejemplo de session_gc() para un script accesible al usuario

<?php
// Nota: Se recomienda usar session_gc() con scripts de administradores de taresas, aunque
// podría utilizarse como sigue.

// Utilizado para la última comprobación de la hora de la última RB
$gc_time = '/tmp/php_session_last_gc';
$gc_period = 1800;

session_start();
// Ejecutar la RB solamente cuando el periodo de RB ha finalizado.
// Esto es, llamar a session_gc() en cada petición es desperdiciar recursos.
if (file_exists($gc_time)) {
if (
filemtime($gc_time) < time() - $gc_period) {
session_gc();
touch($gc_period);
}
} else {
touch($gc_period);
}
?>

Ver también

add a note

User Contributed Notes 2 notes

up
0
i dot carvallo at gmail dot com
14 days 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 month 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