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 – "готовые к употреблению" проекты, которые можно поставить, запустить и посмотреть, как они работают.