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