PHP 8.5.0 Alpha 2 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

session_gc() se utiliza para ejecutar la recolección de basura (Garbage Collection, abreviado GC). PHP utiliza un método probabilístico para ejecutar la recolección de basura de sesión por defecto.

La recolección de basura (GC) basada en un método probabilístico funciona en cierta medida pero presenta algunos problemas. 1) Los datos de sesión de los sitios con poco tráfico pueden no ser eliminados durante el período deseado. 2) Los sitios con mucho tráfico pueden ejecutar la recolección de basura con demasiada frecuencia. 3) La recolección de basura se ejecuta en una solicitud del usuario y este notará una latencia debido a la recolección de basura.

Por lo tanto, se recomienda ejecutar la recolección de basura periódicamente en los sistemas de producción, por ejemplo, "cron" para los sistemas de tipo UNIX. Asegúrese de desactivar la recolección de basura por método probabilístico definiendo session.gc_probability a 0.

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 como éxito, false en caso de fallo.

Los antiguos gestores de almacenamiento no devuelven el número de datos de sesión eliminados sino solo el flag de éxito/fallo. En este caso, el número de datos de sesión eliminados es 1 independientemente del número real de datos eliminados.

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_gc()
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.
// 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
7 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
8 months 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