PHP Сделайте что-то, когда сессия истекла

Итак, скажем, пользователь сделал что-то на моем веб-сайте, например, загрузил некоторые изображения или что-то еще, и он ушел, не выйдя из системы и никогда не вернулся или не сказал, что вернулся через несколько месяцев.

Итак, мой вопрос: есть ли какой-нибудь способ, например, удалить его загруженные файлы после истечения срока действия сеанса, скажем, через 30 минут (помните, что пользователь никогда не перезагружал страницу), так что это нужно было бы полностью запустить на стороне сервера без вмешательства пользователя.

РЕДАКТИРОВАТЬ Спасибо всем за ваши замечательные ответы, это дало мне немало отличных идей, я бы хотел принять все ваши ответы:)

Ответ 1

Один из способов - вызвать

  $thePath = session_save_path();

и перебрать все сохраненные файлы сеанса, устранить их и проверить их на указанное свойство таймаута.

К сожалению, вам нужно просмотреть весь каталог, чтобы найти все файлы сеанса, которые старше определенного периода времени. Вы должны использовать start() для определения возраста файла сеанса.

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

Улучшенный подход с использованием базы данных

Поэтому я предлагаю сохранить данные сеанса в базу данных вашего приложения. Используя SQL, было бы тривиально найти все устаревшие файлы сеанса.

Документация для session_set_save_handler() содержит образец, который объясняет весь этот процесс довольно хорошо на основе объектов.

Ответ 2

Хороший вопрос! Моя первая идея заключалась в использовании решения на базе базы данных. Если вы этого еще не сделали, вы должны отслеживать все активные сеансы в таблице sessions, которая содержит, помимо прочего, теги session_id и last_visited_time. Эта запись будет обновляться каждый раз, когда пользователь посещает ваш сайт:

UPDATE sessions WHERE session_id = "<current session id>" SET last_visited_time = NOW()

Второй частью механизма будет cronjob, который сканирует таблицу sessions для сеансов, чей last_visisted_time не был обновлен в последнее время (в любой промежуток времени, который вы хотите), и удаляет файлы для этого сеанса.

Ответ 3

Мне нравятся все ответы выше, но другое решение будет состоять в том, чтобы назвать загруженные файлы таким образом, что вы знаете, что они "временные", например, добавив их имя с меткой времени. Таким образом, периодический процесс очищает любые такие файлы, если ваша программа не решит, что они должны быть сохранены в конце концов, переименовывая их соответственно.