Codeigniter: Наконец-То Делаем Стабильными Сессии (В Первую Очередь Для Авторизации)

Сессии в 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

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.