(PHP 7 >= 7.1.0, PHP 8)
session_gc — Собирает мусорные данные сессии
Функция 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);
}
?>