session_gc

(PHP 7 >= 7.1.0)

session_gcВыполняет сборку мусора данных сессии

Описание

session_gc ( ) : int|false

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);
}
?>

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