Сессии в Codeigniter хороши для всех.
Правда, они очень удобно сделаны, особенно когда хранишь сессии в базе данных (что я считаю единственно правильным способом).
Файлы cookie зашифрованы, в файлах cookie нет ничего, кроме идентификатора.
Они привязаны к user_agent и, опционально, к IP. Красиво, безопасно.
Но у них есть очень существенный недостаток: время жизни сессии рассчитывается из поля Последняя активность .
Это значит, что если у вас сессия истекла на два дня, то при доступе к сессии с помощью Last_activity < time()-172800, it will be eliminated and a new one will start. Consequently, in order for users not to have to log in to the site every time, last_activity needs to be kept up to date. Поле last_activity обновляется в двух случаях: когда вы пишете что-то новое в сессию, или когда сессия обновляется (по умолчанию каждые 5 минут, опять же относительно Last_activity; указано в конфиге).
И основная проблема в том, что при обновлении сессии изменения session_id и текущий сеанс пользователя прерывается и начинается новый.
Честно говоря, такое поведение сессий привело меня в состояние.
удивления.
В таких реалиях использование нативных сессий как инструмента поддержки авторизации кажется невозможным.
Проблема «горящая», о ней часто упоминают на форумах Codeigniter, но толкового решения я там не увидел.
Но нужда, как известно, хитра в отношении изобретений, поэтому было найдено простое решение.
Первое, что нужно сделать, это конфигурация/config.php укажите частоту обновления сессии, равную времени ее окончания:
================ $config['sess_time_to_update'] = $config['sess_expiration'];
================
Затем включите крючки :
================ $config['enable_hooks'] = TRUE;
================
Затем в конфигурация/hooks.php :
================ $hook['post_controller_constructor'] = array(
'class' => '',
'function' => 'sess_update',
'filename' => 'sess_update.php',
'filepath' => 'hooks'
);
================
(в принципе, можно использовать любой хук, главное, чтобы он выполнялся при каждом открытии страницы)
И в хуках создаём session_update.php :
================ <Эphp
function sess_update()
{
$CI =& get_instance();
if ($CI->session->userdata('last_activity')< time() - 300) {
$CI->session->set_userdata('last_activity', time());
}
}
================
Функция проста как 5 копеек: получаем ссылку на суперобъект codeigniter, смотрим, прошло ли 5 минут с момента последнего обновления сессии (чтобы каждый раз не штурмовать базу лишними запросами) и если да, то вручную устанавливаем Поле Last_activity равно текущему времени.
По сути, эффект тот же, что и указать 5 минут в $config['sess_time_to_update'], но сама сессия остается невредимой, данные никуда не деваются, и ваш авторизованный пользователь придет на сайт на следующий день-два (в зависимости от по значению $config['sess_expiration']) останется авторизованным.
Теги: #codeigniter #сессии #codeigniter
-
Дальнобойщики 3: Видео Выставки И Обсуждение
19 Oct, 24 -
Интернет-Эквайринг
19 Oct, 24 -
Пишем Приложения Для Google Glass
19 Oct, 24