(PHP 7 >= 7.1.0, PHP 8)
session_gc — Собирает мусорные данные сессии
По умолчанию 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);
}
?>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)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.";
}