PHP 8.5.0 Released!

session_gc

(PHP 7 >= 7.1.0, PHP 8)

session_gcExécute le ramasse miette des données de session

Description

session_gc(): int|false

Par défaut, PHP utilise session.gc_probability pour exécuter le ramasse miette des sessions de façon probabiliste à chaque requête. Il y a certaines limitations avec cette approche :

  • Les sites à faible trafic peuvent ne pas avoir leurs données de session supprimées dans la durée préférée.
  • Les sites à fort trafic peuvent voir le ramasse-miette s'exécuter trop fréquemment, effectuant un travail supplémentaire inutile.
  • Le ramasse-miette est effectué lors de la requête de l'utilisateur, et l'utilisateur peut subir un délai.

Pour les systèmes de production, il est recommandé de désactiver le ramasse-miette basé sur la probabilité en configurant session.gc_probability à 0 et explicitement exécuter le ramasse-miette périodiquement, par exemple en utilisant "cron" sur les systèmes de type UNIX pour exécuter un script qui appelle session_gc().

Note: Lors de l'appel de session_gc() depuis un script PHP en ligne de commande, le session.save_path doit être défini à la même valeur que pour les requêtes web, et le script doit avoir les permissions d'accès et de suppression pour les fichiers de session. Cela peut être affecté par l'utilisateur sous lequel le script s'exécute, ainsi que par des fonctionnalités de conteneur ou de sandboxing telles que l'option PrivateTmp= option.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

session_gc() renvoie le nombre d'entrées de sessions supprimées en cas de succès, ou false si une erreur survient.

Note: Les vieux gestionnaires de sauvegarde de session ne renvoient pas le nombre d'entrées de session supprimées, mais plutôt seulement un indicateur de succès/échec. Si c'est le cas, 1 est renvoyé indépendamment du nombre d'entrées de session réellement supprimées.

Exemples

Exemple #1 Exemple de session_gc() pour les planificateurs de tâches comme cron

<?php
// Note: Ce script devrait être exécuté par le même utilisateur que le processus du serveur web.

// Nécessite l'activation des sessions pour initialiser l'accès au gestionnaire de sauvegarde des sessions
session_start();

// Exécuter le Ramasse Miette immédiatement
session_gc();

// Effacer l'ID de session créé par session_gc()
session_destroy();
?>

Exemple #2 Exemple de session_gc() pour des scripts accessible par l'utilisateur

<?php
// Note: il est recommandé que session_gc() soit utilisé par un planificateur de tâches,
// mais il peut être utilisé de la façon suivante.

// Utilisé pour vérifier l'heure de la dernière utilisation du ramasse miette
$gc_time = '/tmp/php_session_last_gc';
$gc_period = 1800;

session_start();
// Exécuter le ramasse miette seulement quand la période s'est écoulée.
// Appeler session_gc() à chaque requête est un gaspillage de ressource.
if (file_exists($gc_time)) {
if (
filemtime($gc_time) < time() - $gc_period) {
session_gc();
touch($gc_time);
}
} else {
touch($gc_time);
}
?>

Voir aussi

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