Новые записи сеанса создаются в базе данных, даже если библиотека сеансов codeigniter не загружена. Почему?

У меня довольно странная проблема с REST-сервером CodeIgniter Криса Кацергиса.

Проблемы:

1) Я НЕ загружаю библиотеку сеансов CodeIgniter, даже тогда новые записи создаются в таблице базы данных ci_sessions каждый раз, когда я делаю HTTP-запрос к моему REST API.

2) Создается новая запись (и старая запись НЕ обновляется) в БД при каждом HTTP-запросе, даже если IP-адрес остается прежним.

Это мой файл config.php:

$config['sess_driver'] = 'database';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 0;
$config['sess_save_path'] = 'ci_sessions';
$config['sess_match_ip'] = TRUE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = TRUE;

$config['cookie_prefix']    = '';
$config['cookie_domain']    = '';
$config['cookie_path']      = '/';
$config['cookie_secure']    = FALSE;
$config['cookie_httponly']  = FALSE;

Я пробовал по отдельности и в комбинации следующие вещи:

$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 0;
$config['sess_regenerate_destroy'] = FALSE;

а также

$config['cookie_domain']    = '.mydomain.com';

Но ничего не сработало.

Это нормально или какой-то баг? Что я делаю неправильно? У кого-нибудь еще такая же проблема?

Другое дело, что я не сталкиваюсь с этой проблемой в vanilla CodeIgniter. Там все работает нормально и как положено.

Обновить

Я нашел кое-что, борясь со второй частью проблемы.

При выполнении первого HTTP-запроса в базе данных создаются две записи сеанса — одна для клиента и другая для REST-сервера. Из второго запроса клиентская «версия» файла cookie ОБНОВЛЯЕТСЯ, а серверная «версия» СОЗДАЕТСЯ ПОВТОРНО.


person Raja    schedule 25.07.2017    source источник
comment
проверить автозагрузку?   -  person James Lalor    schedule 25.07.2017
comment
Уже проверено и перепроверено. Сессии там нет.   -  person Raja    schedule 25.07.2017
comment
Какая бы библиотека вы ни использовали для работы с REST API, она может использовать сеансы.   -  person James Lalor    schedule 25.07.2017
comment
Хорошая точка зрения. Я проверяю это и возвращаюсь к вам.   -  person Raja    schedule 25.07.2017
comment
Слава моему другу. Я полностью пропустил часть библиотеки, о которой вы упомянули. Да, это была проблема. Я использую библиотеку Ion Auth от @BenEdmunds, и файл библиотеки Ion_auth.php загружает в нее сеанс CI.   -  person Raja    schedule 25.07.2017
comment
Но вторая часть проблемы до сих пор остается загадкой... Почему запись сеанса не обновлялась, когда IP-адрес оставался прежним?   -  person Raja    schedule 25.07.2017
comment
Вы создали таблицу сеансов в базе данных codeigniter.com/user_guide/libraries/ Также на autoload.php $autoload['libraries'] = array('session');   -  person Mr. ED    schedule 26.07.2017
comment
Да, я создал таблицу сеансов в базе данных. На самом деле первая часть проблемы решена благодаря @JamesLalor. Сейчас мучаюсь со второй частью. И да, для второй части я автоматически загружаю сеанс.   -  person Raja    schedule 26.07.2017
comment
$config['sess_match_ip'] = FALSE; сделать это ИСТИННЫМ.   -  person James Lalor    schedule 27.07.2017
comment
@JamesLalor Ага. Пытался. Без улучшения. :( Ошибка все еще сохраняется. Я пытаюсь обойти это... Не знаю, сработает ли это... Сообщу вам, что я пробовал, и сработало ли это или нет после завершения. Спасибо за вашу постоянную поддержку ... :)   -  person Raja    schedule 27.07.2017
comment
Возможный дубликат данных сеанса Codeigniter, потерянных после перенаправления   -  person Dan    schedule 08.02.2019


Ответы (1)


Для первой части задачи:

Как отметил @JamesLalor в комментариях,

  1. Вы должны либо автоматически загружать сеанс

    OR

  2. Вы используете внешнюю библиотеку, которая, в свою очередь, загружает библиотеку сеансов.

Для второй части задачи:

Приведенное ниже решение может быть не лучшим, но оно сработало для меня.

Проблема создания нескольких сеансов возникает, когда:

  1. У вас есть сервер REST и клиент в одном каталоге приложения CodeIgniter

    А ТАКЖЕ

  2. Библиотека сеансов загружается автоматически

Для Клиента пользователь является потребителем. Сеанс создается для пользователя, имеющего IP-адрес этого пользователя. Файл cookie устанавливается в браузере пользователя, с помощью которого сеанс проверяется и обновляется (или создается заново) на основе проверки.

Для REST-сервера клиент является потребителем. Здесь также создается сессия (если выполняются оба условия 1 и 2 выше), но на этот раз для Клиента, и эта сессия имеет IP-адрес сервера, на котором находится Клиент (если выполняется условие 1 выше , то это IP-адрес того же сервера, на котором находится ваше приложение). Но на этот раз cookie не удалось установить, так как потребитель не является браузером. Следовательно, проверка сеанса завершается ошибкой, и каждый раз при загрузке страницы создается новый сеанс.

Решение.

REST не имеет состояния, и каждый запрос должен содержать всю информацию, необходимую для выполнения запроса. Поэтому использование сеансов (единственная задача которых — поддерживать состояние пользователя) на сервере REST считается плохой практикой. Задача клиента — поддерживать сеанс пользователя и передавать необходимую информацию серверу REST по каждому запросу.

Поэтому, предполагая, что вам не понадобится сеанс в REST Server, решение состоит в том, чтобы удалить session из списка autoload[‘libraries’] в файле autoload.php и загрузить библиотеку в конструкторе клиента (или когда вам это нужно) .

Извините за грамматические ошибки и/или плохой английский. Это не мой родной язык.

person Rita Chatterjee    schedule 28.07.2017