Forum Webscript.Ru

Программирование => Perl => Тема начата: Troum от 29 Марта 2004, 16:20:49

Название: CGI::Session и удаление старых сессий
Отправлено: Troum от 29 Марта 2004, 16:20:49
При разборе модуля CGI::Session возник один вопрос: имеется созданная сессия, она хранится в базе. У сессии выставлен expire. Если юзер прерывает сессию (уходит с сайта) или expire период заканчивается то сессия в базе отстается висеть (строкой в таблице). Как ее рациональнее оттуда убрать.
Неужели придется писать скрипт, который в какой-то период времени будет перелопачивать таблицу сессий и удалять мертвые записи? Может есть решение в рамках CGI::Session? В perldoc`е я такого не нашел.
Если можно, разъясните ситуацию
Название: CGI::Session и удаление старых сессий
Отправлено: NeoNox от 30 Марта 2004, 20:01:33
Не заметил эту тему...
Так вот, не совсем понимаю почему она должна автоматически удаляться?
Мертвые запись(а точнее мертывых пользователей) ты конечно должен убирать из базы, но это делается не автоматом а скриптом.
Название: CGI::Session и удаление старых сессий
Отправлено: Troum от 30 Марта 2004, 20:30:31
NeoNox , короче создается скрипт по перелопачиванию базы, кидается в cron. Понятно, спасибо

Кстати есть ли преимущества у Apache::Session перед данным модулем (CGI::Session) ?
Название: CGI::Session и удаление старых сессий
Отправлено: pirojok от 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.

С чем это может быть связано?
Название: CGI::Session и удаление старых сессий
Отправлено: pirojok от 21 Октября 2007, 00:46:46
Всем спасибо, нашёл решение.

Оказываеться существует модуль CGI::Session::ExpireSessions, который как раз и создан для удаления просроченых сессий.
Лежит он тут (http://search.cpan.org/~rsavage/CGI-Session-ExpireSessions-1.08/lib/CGI/Session/ExpireSessions.pm#___top)

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

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

#В теле основного скрипта подключил его:
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\'

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

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