Данный пример демонстрирует создание сессии и ее хранение в базе данных mysql.
Пример основан на предыдущем варианте кода, поэтому я привожу тут только тот код, который был изменен для взаимодействия с БД.
Для хранения данных сессии в базе данных, прежде всего требуется создать базу данных и специальную таблицу:
|
1 2 3 4 5 |
CREATE TABLE `sessions` ( `id` char(32) NOT NULL, `a_session` text NOT NULL, PRIMARY KEY (`id`) ); |
При создании новой сессии, в БД будет добавлена новая запись. Поле id будет содержать сессионный ключ, a_session - сессионные данные.
Пример:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
-- -- Дамп данных таблицы `sessions` -- INSERT INTO `sessions` (`id`, `a_session`) VALUES ('12a2ebe8df57f3c89869ae91fe24b86a', '$D = {''_SESSION_ID'' => ''12a2ebe8df57f3c89869ae91fe24b86a'', ''_SESSION_ETIME'' => 604800, ''_SESSION_ATIME'' => 1295775623, ''_SESSION_EXPIRE_LIST'' => {}, ''_SESSION_REMOTE_ADDR'' => ''191.96.20.01'', ''_SESSION_CTIME'' => 1295768464};;$D'); |
Пример кода:
|
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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
package App3; use strict; use warnings; use base 'CGI::Application'; use CGI::Application::Plugin::TT; use CGI::Application::Plugin::DBH (qw/dbh_config dbh/); use CGI::Session::Driver::mysql; use CGI::Application::Plugin::Session; sub setup { my $self = shift; $self->mode_param('step'); $self->start_mode('on_start'); $self->run_modes( on_start => \&on_start, on_save_addr => \&on_save_addr, on_close_session => \&on_close_session, AUTOLOAD => sub { return 'Запрошенной страницы не существует' } ); } sub cgiapp_init { my $self = shift; $self->dbh_config("DBI:mysql:database=db1;host=localhost", 'user', 'password'); # Настройки работы с сессиями $self->session_config( CGI_SESSION_OPTIONS => [ "driver:mysql", $self->query, {Handle=>$self->dbh} ], DEFAULT_EXPIRY => '+1w', COOKIE_PARAMS => { -expires => '+24h', -path => '/', }, SEND_COOKIE => 1, ); } sub on_start { my $self = shift; my $q = $self->query(); my $tt_params = {}; $tt_params->{addr} = $self->session->param('addr'); $tt_params->{block} = 'show_index_page'; return $self->tt_process('template3.tt', $tt_params); } ... |
Привет, а не проще ли использовать CGI:Session и DBI? Выбираем из запроса переменные среды, если нужно, создаем сессию, идентификатор кладем в БД, и в куки юзеру. Я бы сделал так.