Я создаю функцию загрузки, которая хранит загруженный пользователем файл на сервере с идентификатором сессии пользователя в качестве его имени. Теперь я хочу сохранить этот файл на сервере только до тех пор, пока этот сеанс не будет активен.
Итак, мой вопрос заключается в том, как я могу определить из идентификатора сеанса, является ли сеанс активным или истекшим, чтобы в более позднем случае я мог безопасно удалить загруженный пользователем файл.
Это я хочу сделать как очистку через определенные промежутки времени, возможно, используя работу cron, хотя я никогда не использовал ее раньше.
Вы не можете просто полагаться на session.gc_maxlifetime, потому что после этого времени сеанс помечен как мусор, и сборщик мусора запускается только с вероятностью 1% по умолчанию (session.gc_probability).
Лучший подход IMHO – обработать ваши устаревшие данные.
Вы можете, например, запустить время и сохранить его в переменной сеанса:
<?php $_SESSION['last_seen'] = time();//Update this value on each user interaction. ?>
Позже..via cron вы можете сделать что-то вроде этого:
<?php //Get the session id from file name and store it into the $sid variable; session_id($sid);//try to resume the old session session_start(); if (isset($_SESSION['last_seen']) && $_SESSION['last_seen'] > $timeout){//Session is expired //delete file session_destroy(); }else if (!isset($_SESSION['last_seen')){ //already garbaged //delete file session_destroy(); } ?>
Не проверено … просто идея
Я пытаюсь сделать то же самое. Одним из решений было бы определить пользовательскую функцию сбора мусора с session_set_save_handler()
. В этой пользовательской функции вы удаляете загруженные файлы, связанные с сеансом, а затем удаляете сеанс с диска. Единственная проблема, я вижу, что вам придется определять остальные обработчики сеанса:
bool session_set_save_handler ( callback $open, callback $close, callback $read, callback $write, callback $destroy, callback $gc )
Это легко, если вы не полагаетесь на PHP для обработки сеансов. Есть ли способ вызвать функции обработчика по умолчанию PHP из пользовательской функции обработчика?
Интервалы могут быть сделаны следующим образом: кто-то открывает вашу сеть – работает скрипт php -> он проверяет, не отключены ли файлы -> удалять файлы с отложенным временем
И никакой CRON не требовалось 🙂
Это почти невозможно определить из-за отсутствия информации, если пользователь закрыт или нет окна браузера (если он не закрывает его, а включит режим сна и возвращается через 2 дня – сеанс все еще активен AFAIK) – только идея для slove эта проблема наилучшим образом заключается в использовании собственного механизма сеанса с проверкой AJAX.