По порядочку. Причем файлы если данные сессии хранятся в БД?
По умолчанию, CGI::Session использует для хранилища файлы, но никто не мешает использовать
БД:
Создаем для этого таблицу:
CREATE TABLE my_sessions (
id CHAR(32) NOT NULL UNIQUE,
a_session TEXT NOT NULL
);
Что тут хранится?
id - уникальный ключ (32 байта) Сгенерированный MD5, SHA1 или способом дедушки на кухне
(модуль Session::ID::Incr)
a_session - это не ид пользователя ,а сериализованные данные (хеш) в котором хранятся время
жизни, ip (если есть) и т.д. + ПО желанию вы можете внести туда что-то свое через метод
param. Сериализуется все по умолчанию через Data::Dumper (Storable побыстрее, так что если
установлен, то возможно стоит его использовать, задается при создании сессии)
Таблица есть, теперь делаем такие движения:
use CGI::Session;
use CGI qw/:cgi/;
my $cgi = new CGI;
#по умолчанию таблица называется sessions
# если у вас не так, то надо указать имя таблицы:
$CGI::Session::MySQL::TABLE_NAME = \'my_sessions\';
# далее вызываем объект сессии. Если она есть и ее срок не истек, то сответственно получаете
#параметры ессии, если истек или ее нет, то автоматом открывается новая
# Нам он НЕ очень нужен :)
my $s = new CGI::Session("driver:MySQL", $cgi, {Handle=>$dbh});
#Используем это:
#Альтернативный способ "без автоматов" сойдет для авторизации - метод load
my $s = CGI::Session->load("driver:MySQL", $cgi, {Handle=>$dbh});
#проверяем срок годности:
if ( $s->is_expired ) {
#если устарела
$s->delete();#удаляем ее, чтоб не засорять
&login;#пусть логинится
exit(0);
}
if ( $s->is_empty ) {
# если ее вообще нет, то пусть тоже логинится
&login;#пусть логинится
exit(0);
}
# все кривые ушли на авторизацию, остались живые
# можем получить нужные параметры
my $user_id = $s->param(\'user_id\');#если он конечно нужен
#зададим какой-нибудь параметр:
$s->param(\'my_param\',\'Хоу ду ю ду миссис Джейн?\');
#делаем что угодно, хотя это нам на самом деле и не нужно
# НО нужно продлить время жизни
$s->expire(\'+2h\');#продлеваем время жизни сессии на пару часов
# время жизни сохраняется и в БД, не только в куках
# куки нам вообще неинтересны
#ля-ля-ля
# Только когда будете отдавать пользователю страницу, не забудьте вначале послать заголовки
print $s->header();
При авторизации, вы проверяете пароль, логин и если все прошло успешно, создаете новую
сессию
my $s = new CGI::Session("driver:MySQL", $cgi, {Handle=>$dbh});
Примерно так.
В куках передается только sid и ничего более, все остальное хранится на стороне сервера.
И хранить там из своего по-моему надо только id пользователя, чтоб его опознать и получить
по этому id данные которые хранятся уже в ваших хранилищах (не важно где)
Можно на несколько разных скриптов использовать одну таблицу сессий ,просто разные скрипты
будет искать данные своих пользователях в разных местах.
CGI::Session - это не инструмент для сохранения пользовательских данных, это лишь инструмент
для временного (в течении сеанса или нескольких сеансов) сохранения временных данных с
привязкой к конкретному пользователю.
Лично мне CGI::Session не понравился по нескольким причинам, если говорить о БД:
универсальность хранения (или в файлах или в БД как хотите) делает его хромым при работе с
БД. Вместо простых SQL запросов для проверки времени истечения жизни сессии, он выбирает
конкретную запись ,восстанавливает сериализованные данные и потом смотрит. Намного лучше,
если бы это значение было в отдельном поле, тогда можно было бы пачкой удалять все
устаревшие сессии, а иначе происходит накопление "мертвых" сессий (один раз вас юзер посетил
, вы ему сделали сессию, и он никогда не вернулся, а в БД запись висит).
Поэтому лучше написать и использовать что-то свое. В случае файлов это не так критично, хотя
тоже захламляется.
Сессии нужно подтирать - это как стикер, написал, повесил на холодильник, через день
прочитал и выкинул. Если понадобилось - взял новую бумажку и там опять накалякал.
P.S. Сорри, если сумбурно, но на развернутуе сочинение how-to пока времени не хватает ,может
соберусь как нибудь..