Автор Тема: CGI::Session и удаление старых сессий  (Прочитано 4307 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Troum

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 71
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
CGI::Session и удаление старых сессий
« : 29 Марта 2004, 16:20:49 »
При разборе модуля CGI::Session возник один вопрос: имеется созданная сессия, она хранится в базе. У сессии выставлен expire. Если юзер прерывает сессию (уходит с сайта) или expire период заканчивается то сессия в базе отстается висеть (строкой в таблице). Как ее рациональнее оттуда убрать.
Неужели придется писать скрипт, который в какой-то период времени будет перелопачивать таблицу сессий и удалять мертвые записи? Может есть решение в рамках CGI::Session? В perldoc`е я такого не нашел.
Если можно, разъясните ситуацию

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
CGI::Session и удаление старых сессий
« Ответ #1 : 30 Марта 2004, 20:01:33 »
Не заметил эту тему...
Так вот, не совсем понимаю почему она должна автоматически удаляться?
Мертвые запись(а точнее мертывых пользователей) ты конечно должен убирать из базы, но это делается не автоматом а скриптом.
The documentations is your friend

Оффлайн Troum

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 71
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
CGI::Session и удаление старых сессий
« Ответ #2 : 30 Марта 2004, 20:30:31 »
NeoNox , короче создается скрипт по перелопачиванию базы, кидается в cron. Понятно, спасибо

Кстати есть ли преимущества у Apache::Session перед данным модулем (CGI::Session) ?

Оффлайн pirojok

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 12
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
CGI::Session и удаление старых сессий
« Ответ #3 : 20 Октября 2007, 19:58:18 »
Изучая perl столкнулся со следующей проблемой:

На сайте используется метод аутентификации пользователя через сессии, используя модуль CGI::Session и MySQL . Всё бы ничего, всё даже работает, но не получаетьсяя удалять старые(истекшие) сессии.

В мануале к модулю есть довольно простой примерчик для данной операции, но он не работает.
CGI::Session->find(\\&purge);
                  
sub purge {
                  
my ($session) = @_;
                  die 
$session;
                  
next if $session->is_empty;    # <-- already expired?!
                  
if ( ($session->ctime 60) <= time() ) {
                  
$session->delete() or warn "couldn\'t remove " $session->id ": " $session->errstr;
                  }
                  }


Проблема в том, что программа не заходит в подпрограмму &purge.

С чем это может быть связано?

Оффлайн pirojok

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 12
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
CGI::Session и удаление старых сессий
« Ответ #4 : 21 Октября 2007, 00:46:46 »
Всем спасибо, нашёл решение.

Оказываеться существует модуль CGI::Session::ExpireSessions, который как раз и создан для удаления просроченых сессий.
Лежит он тут

Если кому то интересно, то реализация следующая:

Т.к. я не админ сервера, где я тестирую скрипт, то установить этот модуль(а он не стандартный) на сервер я не могу. Поступил общеизвестным способом. А именно файл модуля положил в папку с основным скриптом.

#В теле основного скрипта подключил его:
use expiresessions

#Далее соединяемся с БД:
my $db_user_name = \'имя_пользователя\';
my $db_password = \'пароль\';
my $dsn = \'DBI:mysql:имя_БД:хост\';
my $dbh = DBI->connect($dsn, $db_user_name, $db_password)|| die "Error while conecting to DB: $DBI::errstr()";

#А далее всего одной строкой избавляемся от мёртвых сессий.
CGI::Session::ExpireSessions -> new(dbh => $dbh, verbose => 0) -> expire_db_sessions(delta=>1, table_name=>\'kr_sessions\');

#Где:
#dbh => $dbh дискриптор соединения с БД
#delta=>1 критерий удаления, на сколько просрочена сессия в секундах.
#table_name=>\'kr_sessions\' имя таблицы, если оно отлично от \'sessions\'


Ну вот вроде бы и всё. Если есть вопросы, коментарии пишите.

ПС интересно почему предедущий код не работает?

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28