15.01.2013
В сессионном плагине найдены два довольно старых и неприятных бага.
Первый возникал при первом входе пользователя и первичном обращении к get_session и выражался в создании лишней записи в таблице сессий (или лишних ключей в Memcached). Для удаления его в проектах, использующих сессии достаточно просто накатить новую версию из репозитория (make plup) и перегрузить проект.
Второй баг более комплексный и возникает в следующем случае: пользователь заходит на сайт, бэкенд запрашивает для него сессию, получает ее и на этом же запросе пишет что-то в сессию (вызов $keeper->{session}->store_value). В этом случае сессионная кука пользователю выставлена, но еще не может быть прочитана. Процедура store_value пытается снова получить session_id, не получает ничего и проводит заново процедуру получения сессии. В итоге выставляется еще одна кука, старая сессия отправляется в ад (вместе с сопутствующими строками в таблице сессий) и возникает новая сессия с одним заполненным значением. Повторный вызов store_value в пределах этого же запроса приводит к возникновению еще одной сессии с одним значением и так далее.
Если в вашем приложении есть подобное место, необходимо не только обновить плагин из репозитория, но и поправить вызовы процедуры сохранения, добавив в него параметр _session_id, заполненный идентификатором свежесозданной сессии:
# Получение сессии, сохранение ее в глобальной переменной
$session = $keeper->{session}->get_session;
# Сохранение параметров и передача id сессии
$keeper->{session}->store_value(
_session_id => $session->{_session_id},
param1 => 'param1', param2 => 'param2'
);
В ближайшее время плагин будет модифицирован следующим образом: $keeper->{session}->get_session будет возвращать не HASH, а объект session::Session, который уже будет нагружен методами store_value, delete_key, logon, logoff и так далее. Объект будет навеском над имеющимся зоопарком процедур, так что весь уже написанный код можно будет не переписывать заново. Однако, в дальнейшем мы рекомендуем использовать только объектные методы. Так сказать, во избежание.
Кроме того, добавлена возможность передавать в плагин из приложения значение домена, на который выставляется кука. Это сделано для реализации муравейников - приложений, обслуживающих несколько независимых проектов, живущих в разных доменах. Примером такого приложения является Promosite, который будет добавлен в репозиторий в раздел примеров.