Start · Sprachen · PHP · Referenz · session_gc

session_gc

Funktion

Führt die Garbage Collection (GC) der Session-Daten manuell durch und gibt die Anzahl der gelöschten Sessions zurück.

seit PHP 7.1.0 Kategorie: http

Signatur

session_gc(): int|false

Beschreibung

session_gc() löst die Garbage Collection des konfigurierten Session-Handlers manuell aus. Dabei werden alle abgelaufenen Session-Daten entfernt, deren Lebensdauer (session.gc_maxlifetime) überschritten wurde.

Standardmäßig führt PHP die Session-GC probabilistisch durch, gesteuert über session.gc_probability und session.gc_divisor. Auf Produktivsystemen mit hohem Traffic kann dies dazu führen, dass veraltete Sessions lange bestehen bleiben oder der GC-Lauf zufällig eine Benutzeranfrage stark verlangsamt. Mit session_gc() lässt sich die GC stattdessen gezielt — z. B. in einem Cronjob — und damit vorhersehbar ausführen.

Die Funktion setzt voraus, dass eine Session gestartet wurde (session_start()) oder der verwendete Session-Handler anderweitig initialisiert ist. Die Rückgabe ist die Anzahl der tatsächlich gelöschten Session-Datensätze, oder false bei einem Fehler. Nicht alle Session-Handler (z. B. benutzerdefinierte Handler) unterstützen eine genaue Rückgabe der Löschanzahl.

Besonders empfehlenswert ist der Einsatz in Kombination mit session.gc_probability = 0, um die automatische probabilistische GC vollständig zu deaktivieren und durch einen geplanten Aufruf von session_gc() zu ersetzen.

Rückgabewert

Typ
int|false
Beschreibung
Gibt die Anzahl der erfolgreich gelöschten (abgelaufenen) Session-Datensätze zurück. Gibt false zurück, wenn ein Fehler aufgetreten ist oder der Session-Handler keine Rückgabe unterstützt.

Beispiele

Manuelle GC nach Session-Start

<?php
session_start();

$deleted = session_gc();

if ($deleted === false) {
    echo 'Garbage Collection fehlgeschlagen oder nicht unterstützt.';
} else {
    echo 'Gelöschte abgelaufene Sessions: ' . $deleted;
}
Gelöschte abgelaufene Sessions: 3

GC per Cronjob mit deaktivierter probabilistischer GC

<?php
// In php.ini oder per ini_set:
// session.gc_probability = 0  <- automatische GC deaktiviert
// session.gc_maxlifetime = 1440

// Dieses Skript wird z. B. minütlich per Cronjob aufgerufen:
session_start();

$start   = microtime(true);
$deleted = session_gc();
$elapsed = round((microtime(true) - $start) * 1000, 2);

echo sprintf(
    '[%s] Session-GC abgeschlossen: %d Sessions gelöscht in %s ms.' . PHP_EOL,
    date('Y-m-d H:i:s'),
    $deleted === false ? 0 : $deleted,
    $elapsed
);

session_write_close();
[2024-06-01 03:00:00] Session-GC abgeschlossen: 12 Sessions gelöscht in 4.73 ms.

// Wichtig · Fallstricke

Kompatibilität mit Session-Handlern: Benutzerdefinierte Session-Handler, die über session_set_save_handler() registriert wurden, müssen die GC-Methode (gc) korrekt implementieren und einen sinnvollen Rückgabewert liefern, damit session_gc() korrekt funktioniert. Handler, die false oder 0 zurückliefern, können zu Fehlinterpretationen führen.

Performance: Bei Datenbankbasierten Session-Handlern mit sehr vielen Sessions kann die GC spürbar lange dauern. Der Einsatz per Cronjob schützt normale Benutzeranfragen vor dieser Latenz.

Voraussetzung: Die Funktion steht erst ab PHP 7.1.0 zur Verfügung. In älteren PHP-Versionen muss die GC ausschließlich über die probabilistischen INI-Einstellungen gesteuert werden.