PHP 8.4.2 Released!

session_gc

(PHP 7 >= 7.1.0, PHP 8)

session_gcСобирает мусорные данные сессии

Описание

session_gc(): int|false

Функция session_gc() собирает мусор, который оставили данные сессии. По умолчанию PHP запускает сборку мусорных данных сессии на основе вероятности.

Сборка мусора на основе вероятности работает, но порождает ряд проблем. 1) На низконагруженных сайтах данные сессии иногда не удаляются за время, в течение которого ожидалась сборка мусора. 2) На высоконагруженных сайтах сборка мусора иногда выполняется слишком часто. 3) Сборка мусора выполняется во время обработки запроса пользователя и пользователь сталкивается с дополнительной задержкой.

Поэтому рекомендуется периодически выполнять сборку мусора в производственных системах, например, через запуск cron-задач в UNIX-подобных системах. При этом сборку мусора на основе вероятности отключают установкой для директивы session.gc_probability значения 0.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

В случае успешного выполнения функция session_gc() возвращает количество данных сессии, которые она удалила, или false, если возникла ошибка.

Старые обработчики сохранения сессии не возвращают количество удалённых данных сессии, а только флаг успеха или неудачи. В этом случае количество удалённых данных сессии становится равным 1 независимо от фактического количества данных, которые удалила функция.

Примеры

Пример #1 Пример использования функции session_gc() в скрипте, который запускает диспетчер задач наподобие cron

<?php

// Примечание: Скрипт требуется запускать от имени того же пользователя, который запустил процесс веб-сервера

// Для инициализации доступа к хранилищу данных сессии требуется активная сессия
session_start();

// Запускаем немедленную сборку мусора
session_gc();

// Очищаем идентификатор сессии, который создали в процессе сборки мусора
session_destroy();

?>

Пример #2 Пример сборки сессионного мусора функцией session_gc() в доступном пользователю скрипте

<?php

// Примечание: рекомендуется вызывать функцию session_gc() в скрипте, который запускает диспетчер задач,
// но можно вызывать и в пользовательском скрипте

// Проверяем время последней сборки мусора
$gc_time = '/tmp/php_session_last_gc';
$gc_period = 1800;

session_start();

// Собираем мусор только когда закончился период сборки мусора,
// поскольку вызов функции session_gc() при каждом запросе напрасно расходует ресурсы
if (file_exists($gc_time)) {
if (
filemtime($gc_time) < time() - $gc_period) {
session_gc();
touch($gc_time);
}
} else {
touch($gc_time);
}

?>

Смотрите также

Добавить

Примечания пользователей 2 notes

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