(PHP 7 >= 7.1.0, PHP 8)
session_gc — Выполняет сборку мусора данных сессии
session_gc() используется для выполнения сборки мусора (garbage collection) для данных сессии. По умолчанию 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);
}
?>