PHP 8.4.2 Released!

session_gc

(PHP 7 >= 7.1.0, PHP 8)

session_gcFührt die Garbage Collection der Session-Daten durch

Beschreibung

session_gc(): int|false

session_gc() wird verwendet, um die GC (Garbage Collection) der Session-Daten durchzuführen. PHP führt standardmäßig eine wahrscheinlichkeitsbasierte Session-GC durch.

Die wahrscheinlichkeitsbasierte GC funktioniert einigermaßen, bringt aber einige Probleme mit sich. 1) Die Session-Daten von Websites mit geringem Datenverkehr werden möglicherweise nicht innerhalb der gewünschten Frist gelöscht. 2) Bei Websites mit hohem Datenverkehr kann die GC zu häufig erfolgen. 3) Die GC wird durchgeführt, während eine Anfrage des Benutzers bearbeitet wird, was zu einer zusätzlichen Verzögerung für den Benutzer führt.

Daher wird empfohlen, die GC auf Produktivsystemen regelmäßig auszuführen, bei UNIX-ähnlichen Systemen z. B. mit "cron". Es ist sicherzustellen, dass die wahrscheinlichkeitsbasierte GC deaktiviert ist, indem session.gc_probability auf 0 gesetzt wird.

Parameter-Liste

Diese Funktion besitzt keine Parameter.

Rückgabewerte

session_gc() gibt bei Erfolg die Anzahl der gelöschten Session-Daten zurück. Bei einem Fehler wird false zurückgegeben.

Alte Speicherverfahren geben nicht die Anzahl der gelöschten Session-Daten zurück, sondern nur das Flag für Erfolg/Fehlschlag. In diesem Fall ist die Anzahl der gelöschten Session-Daten immer 1, unabhängig von der tatsächlichen Anzahl der gelöschten Daten.

Beispiele

Beispiel #1 session_gc()-Beispiel für Taskmanager wie cron

<?php
// Hinweis: Dieses Skript muss vom selben Benutzer ausgeführt werden
// wie der Prozess des Webservers.

// Um den Zugriff auf den Session-Datenspeicher zu initialisieren,
// ist eine aktive Session erforderlich.
session_start();

// Führt GC sofort aus
session_gc();

// Löschen der von session_gc() erzeugten Session-ID
session_destroy();
?>

Beispiel #2 session_gc()-Beispiel für ein Skript, auf das ein Benutzer Zugriff hat

<?php
// Hinweis: Es wird empfohlen, dass session_gc() von einem Taskmanager-Skript
// verwendet wird, aber es kann auch wie folgt verwendet werden.

// Wird verwendet, um den letzten GC-Zeitpunkt zu überprüfen
$gc_time = '/tmp/php_session_last_gc';
$gc_period = 1800;

session_start();
// GC nur dann ausführen, wenn die GC-Periode verstrichen ist,
// d. h. session_gc() bei jeder Anfrage aufzurufen, ist eine Verschwendung
// von Ressourcen.
if (file_exists($gc_time)) {
if (
filemtime($gc_time) < time() - $gc_period) {
session_gc();
touch($gc_time);
}
} else {
touch($gc_time);
}
?>

Siehe auch

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