Узнайте, истек ли сеанс с определенным идентификатором - PullRequest
0 голосов
/ 21 января 2011

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

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

Это я хочу сделать для очистки через определенные промежутки времени, возможно, с помощью задания cron, хотя я никогда не использовал его раньше.

Ответы [ 3 ]

2 голосов
/ 21 января 2011

Вы не можете просто полагаться на session.gc_maxlifetime, поскольку по истечении этого времени сеанс помечается как мусор, и сборщик мусора запускается только с вероятностью 1% по умолчанию (session.gc_probability).

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

Вы можете, например, запустить время и сохранить его в переменной сеанса:

<?php $_SESSION['last_seen'] = time();//Update this value on each user interaction. ?>

Позже ... через 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();
}
?>

Не проверено ... просто идея

2 голосов
/ 07 июля 2011

Я пытаюсь сделать то же самое. Одним из решений будет определение пользовательской функции сборщика мусора с session_set_save_handler(). В этой пользовательской функции вы удалили загруженные файлы, связанные с сеансом, а затем удалили сеанс с диска. Единственная проблема, которую я вижу, заключается в том, что вам придется определить и остальные обработчики сеансов:

bool session_set_save_handler ( callback $open, 
                                callback $close, 
                                callback $read, 
                                callback $write, 
                                callback $destroy, 
                                callback $gc )

Это легко, если вы не используете PHP для обработки сессий. Есть ли способ вызова функций-обработчиков по умолчанию PHP из пользовательской функции-обработчика?

0 голосов
/ 21 января 2011

Интервалы могут быть сделаны следующим образом - кто-то открывает вашу сеть -> php-скрипт запущен -> проверяет, не истек ли срок файлов -> удаляет файлы с временным интервалом

И CRON не нужен :-)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...