Revision 254
Date:
2012/09/26 16:44:59
Author:
ahitrov
Revision Log:
Sessions through Memcached
Files:
Legend:
Added
Removed
Modified
utf8/plugins/session/config.proto
6
6
#############################################################################
7
7
8
8
PLUGINS += session
9
PROJECT_REQUIRED += Apache-Session
9
PROJECT_REQUIRED += Apache-Session Apache-Session-Memcached
10
10
PROJECT_REQUIRED += JSON-XS
11
11
PROJECT_REQUIRED += P-WebFetcher
12
12
…
…
32
32
33
33
REWRITE += SESSION_STORAGE SESSION_DOMAIN SESSION_LIFETIME SESSION_EXPIRES
34
34
35
########################################################################
35
###########################################################################
36
36
#
37
37
# SESSION_DOMAIN
38
38
# Домен, на котором отвечает проект. Можно не указывать
39
39
# SESSION_STORAGE
40
# Контейнер для хранения сессий. Варианты: POSTGRES и FILE
40
# Контейнер для хранения сессий. Варианты: POSTGRES, MEMCACHED, FILE
41
# Для работы сессий через Memcached в конфиге проекта или инсталляции
42
# должны быть установлены параметры
43
# MEMCACHED_ENABLE = 1
44
# MEMCACHED_SERVERS = список серверов с портами, разделенный пробелами
41
45
# SESSION_LIFETIME
42
46
# Время жизни сессий до автоочистки. Задается в часах, используется
43
47
# при включении в crontab проекта скрипта из services
44
48
# SESSION_EXPIRES
45
49
# Время жизни куки сессии. Задается в формате Apache
46
50
#
47
########################################################################
51
###########################################################################
48
52
49
53
50
54
### AUTH::FaceBook
…
…
90
94
GOOGLE_SCOPE = https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email
91
95
REWRITE += GOOGLE_SCOPE
92
96
97
93
98
CONNECTION_TIMEOUT = 3
94
95
96
99
PROJECT_REQUIRED += Crypt-SSLeay
utf8/plugins/session/lib/session/Keeper.pm
7
7
use Apache::Cookie;
8
8
use Apache::Session::File;
9
9
use Apache::Session::Postgres;
10
use Apache::Session::Memcached;
10
11
use Contenido::Globals;
11
12
use Data::Dumper;
12
13
…
…
99
100
);
100
101
my ($type_prop) = grep { $_->{attr} eq 'type' } $profile->structure;
101
102
$data{type} = $profile->type if $type_prop;
103
my ($ava_prop) = grep { $_->{attr} eq 'avatar' } $profile->structure;
104
if ( $ava_prop ) {
105
my $avatar = $profile->get_image('avatar');
106
$data{avatar} = $avatar->{mini}{filename} if ref $avatar && exists $avatar->{filename};
107
}
102
108
$self->store_value ( %data );
103
109
return $self->get_session();
104
110
}
…
…
230
236
Handle => $keeper->SQL,
231
237
};
232
238
};
239
} elsif ( $state->{session}->storage eq 'MEMCACHED' ) {
240
eval {
241
tie %session, 'Apache::Session::Memcached', $sid, {
242
Handler => $keeper->{session}->MEMD,
243
Expiration => $state->{session}->{lifetime},
244
};
245
};
233
246
} else {
234
247
eval {
235
248
tie %session, 'Apache::Session::File', $sid, {
236
Directory => $state->session->session_dir,
249
Directory => $state->{session}->session_dir,
237
250
};
238
251
};
239
252
}
…
…
256
269
Handle => $keeper->SQL,
257
270
};
258
271
};
272
} elsif ( $state->{session}->storage eq 'MEMCACHED' ) {
273
eval {
274
tie %session, 'Apache::Session::Memcached', undef, {
275
Handler => $keeper->{session}->MEMD,
276
Expiration => $state->{session}->{lifetime},
277
};
278
};
259
279
} else {
260
280
eval {
261
281
tie %session, 'Apache::Session::File', undef, {
262
Directory => $state->session->session_dir,
282
Directory => $state->{session}->session_dir,
263
283
};
264
284
};
265
285
}
utf8/plugins/session/lib/session/State.pm.proto
11
11
my $self = {};
12
12
bless $self, $class;
13
13
14
# configured
15
$self->{project} = '@PROJECT@';
16
$self->{debug} = (lc('@DEBUG@') eq 'yes');
17
$self->{project_name} = '@PROJECT_NAME@';
18
$self->{default_expire} = '@DEFAULT_EXPIRE@' || 300;
19
$self->{default_object_expire} = '@DEFAULT_OBJECT_EXPIRE@' || 600;
20
14
21
# зашитая конфигурация плагина
15
22
$self->{db_type} = 'none';
16
23
$self->{storage} = '@SESSION_STORAGE@' || 'FILE'; ## Значения: FILE POSTGRES MEMCACHED
…
…
36
43
$self->{images_directory} = '';
37
44
$self->{binary_directory} = '';
38
45
$self->{preview} = '';
39
$self->{debug} = '';
40
46
$self->{store_method} = '';
41
47
$self->{cascade} = '';
42
$self->{memcached_enable} = '';
43
48
49
$self->{memcached_enable} = lc( '@MEMCACHED_ENABLE@' ) eq 'yes' ? 1 : 0;
50
$self->{memcached_backend} = '@MEMCACHED_BACKEND@';
51
$self->{memcached_select_timeout} = '@MEMCACHED_SELECT_TIMEOUT@' || 0.2;
52
$self->{memcached_servers} = [qw(@MEMCACHED_SERVERS@)];
53
$self->{memcached_enable_compress} = lc( '@MEMCACHED_ENABLE_COMPRESS@' ) eq 'yes' ? 1 : 0;
54
$self->{memcached_delayed} = lc('@MEMCACHED_DELAYED@') eq 'yes' ? 1 : 0;
55
$self->{memcached_set_mode} = lc('@MEMCACHED_SET_MODE@') eq 'add' ? 'add' : 'set';
56
$self->{memcached_busy_lock} = 60;
57
$self->{memcached_namespace} = lc( $self->{'project'} ).'|plugin_session|';
58
59
$self->{memcached_object_expire} = undef;
60
61
$self->{storage} = 'FILE' if $self->{storage} eq 'MEMCACHED' && !$self->{memcached_enable};
62
44
63
$self->{facebook_app_id} = '@FACEBOOK_APP_ID@';
45
64
$self->{facebook_app_secret} = '@FACEBOOK_APP_SECRET@';
46
65
$self->{facebook_redirect_uri} = '@FACEBOOK_REDIRECT_URL@';
…
…
96
115
db_name
97
116
db_user
98
117
db_password
99
data_directory images_directory binary_directory preview debug store_method cascade memcached_enable
118
119
memcached_enable
120
memcached_servers
121
memcached_select_timeout
122
memcached_backend
123
memcached_enable_compress
124
memcached_set_mode
125
memcached_object_expire
126
memcached_busy_lock
127
memcached_delayed
128
memcached_namespace
129
130
data_directory
131
images_directory
132
binary_directory
133
preview
134
debug
135
store_method
136
cascade
100
137
);
101
138
}
102
139
Небольшая справка по веткам
cnddist – контейнер, в котором хранятся все дистрибутивы всех библиотек и программных пакетов, которые использовались при построении различных версий Contenido. Если какой-то библиотеки в данном хранилище нет, инсталлятор сделает попытку "подтянуть" ее с веба (например, с CPAN). Если библиотека слишком старая, есть очень большая вероятность, что ее там уже нет. Поэтому мы храним весь хлам от всех сборок. Если какой-то дистрибутив вдруг отсутствует в cnddist - напишите нам, мы положим его туда.
koi8 – отмирающая ветка, чей код, выдача и все внутренние библиотеки заточены на кодировку KOI8-R. Вносятся только те дополнения, которые касаются внешнего вида и функционала админки, баги ядра, обязательные обновления портов и мелочи, которые легко скопипастить. В дальнейшем планируется полная остановка поддержки по данной ветке.
utf8 – актуальная ветка, заточенная под UTF-8.
Внутри каждой ветки: core – исходники ядра; install – скрипт установки инсталляции; plugins – плагины; samples – "готовые к употреблению" проекты, которые можно поставить, запустить и посмотреть, как они работают.