Forum Webscript.Ru
Программирование => Perl => Тема начата: Troum от 29 Марта 2004, 16:20:49
-
При разборе модуля CGI::Session возник один вопрос: имеется созданная сессия, она хранится в базе. У сессии выставлен expire. Если юзер прерывает сессию (уходит с сайта) или expire период заканчивается то сессия в базе отстается висеть (строкой в таблице). Как ее рациональнее оттуда убрать.
Неужели придется писать скрипт, который в какой-то период времени будет перелопачивать таблицу сессий и удалять мертвые записи? Может есть решение в рамках CGI::Session? В perldoc`е я такого не нашел.
Если можно, разъясните ситуацию
-
Не заметил эту тему...
Так вот, не совсем понимаю почему она должна автоматически удаляться?
Мертвые запись(а точнее мертывых пользователей) ты конечно должен убирать из базы, но это делается не автоматом а скриптом.
-
NeoNox , короче создается скрипт по перелопачиванию базы, кидается в cron. Понятно, спасибо
Кстати есть ли преимущества у Apache::Session перед данным модулем (CGI::Session) ?
-
Изучая 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::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\'
Ну вот вроде бы и всё. Если есть вопросы, коментарии пишите.
ПС интересно почему предедущий код не работает?