session_gc

(PHP 7 >= 7.1.0, PHP 8)

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

Описание

session_gc(): int|false

По умолчанию PHP использует session.gc_probability для запуска сборщика мусора сессий на основе вероятности при каждом запросе. У этого подхода есть ограничения:

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

Для производственных систем рекомендуется отключить сборку мусора на основе вероятности, установив значение session.gc_probability равным 0 и явно запускать сборщик мусора периодически, например, с помощью «cron» в UNIX-подобных системах для запуска скрипта, который вызывает функцию session_gc().

Замечание: При вызове функции session_gc() из PHP-скрипта в командной строке, session.save_path должен быть установлен на то же значение, что и для веб-запросов, а скрипт должен иметь права доступа и удаления для файлов сессии. На это могут влиять пользователь, от имени которого запускается скрипт, а также функции контейнера или песочницы, такие как опция PrivateTmp= systemd. option.

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

Сигнатура функции не содержит параметров.

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

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

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

Примеры

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

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

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

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

// Очистка идентификатора сессии, который создан функцией session_start()
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
1
i dot carvallo at gmail dot com
1 year 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 year 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