О сессиях для анонимных юзеров.

Ср, 01/06/2016 - 10:49

Ситуация такая. Анонимные юзеры на сайте проходят с мобилы тест  Quiz. И им периодически на одном из вопросов (не на каком-то конкретном) вместо перехода на следующий пишет "Доступ запрещён". С правами и настройками всё определённо в порядке. Есть подозрение, что это происходит из-за прерывания сессии. Смысл такой:
1. Quiz идентифицирует текущего анонимного юзера по сессии.
2. Юзер проходит тест с мобильного через мобильный интернет, если это играет роль, то там варианты в лучшем случае HSPA+, в худшем EDGE.

Я подозреваю, что мобильный интернет может быть в данном случае слабым местом. Мало того, что он постоянно скачет с 2г на 3г, так ведь ещё в теории он может перекидывать коннект с одной вышки на другую и это в теории может привести к смене айпишника и переинициализации сессии. Исходя из вышесказанного хотелось бы уточнить у знающих людей следующие вопросы:
1. Имеют ли мои подозрения какую-то правдоподобность?
2. Есть ли какие-то надёжные способы идентифицировать сессию анонимного юзера глобально на уровне php или ядра друпала? Т.е. если скажем раздавать куки и идентифицировать сессию по ним, то делать это так, чтоюы все модули видели, что это одна и та же сессия.

ЗЫ: вариант, если юзер зайдёт через неделю и продолжит старую сессию мне подходит.

0 Спасибо

Комментарии

Аватар пользователя sergeybelya
11 months 2 дня назад sergeybelya #

Вряд ли для анонимов используются сессии.

0 Спасибо
Аватар пользователя gun_dose
11 months 2 дня назад gun_dose #

$_SESSION - глобальная переменная пхп. И используют её все, кому не лень, в том числе и я.

<?phpfunction quiz_access_question($quiz, $question_number) {
  if (!$question_number || empty($_SESSION['quiz'][$quiz->nid]['result_id'])) {
    return FALSE;
  } 
...blablabla
?>

Скорее всего причина где-то тут. Но блин, я лично видел юзеров, у которых выскакивала ошибка доступа, а воспроизвести самому эту ошибку мне пока не удаётся, что только не пробовал. Где вообще можно погуглить общую инфу о том, при каких условиях старая сессия может закрываться?

0 Спасибо
Аватар пользователя sergeybelya
11 months 2 дня назад sergeybelya #

Не забываейте про session_start(). Насколько я знаю, по дефолту друпал не инициализирует сессии для анонимов - поковыряйте код модуля quiz

0 Спасибо
Аватар пользователя gun_dose
11 months 2 дня назад gun_dose #

нормально он всё инициализирует, иначе бы quiz для анонимов не работал вообще. Да что там quiz, уберкарт с коммерсом не работали, да и ещё много чего.

0 Спасибо
Аватар пользователя sergeybelya
11 months 2 дня назад sergeybelya #

Ну так это делается уже в самих модулях.

0 Спасибо
Аватар пользователя dashiwa
11 months 2 дня назад dashiwa #
gun_dose написал:
иначе бы quiz для анонимов не работал вообще.

Про печеньки все забывают

0 Спасибо
Аватар пользователя dashiwa
11 months 2 дня назад dashiwa #
function lists_session($key, $value = NULL) {
  global $user;

  static $storage;

  // If the user is anonymous, force a session start.
  if(!user->uid) {
    drupal_session_start();
  }

  if ($value) {
    $storage[$key] = $value;
    $_SESSION['lists'][$key] = $value;   // I use 'lists' in case some other module uses 'type' in $_SESSION
  }
  else if (empty($storage[$key]) && isset($_SESSION['lists'][$key])) {
    $storage[$key] = $_SESSION['lists'][$key];
  }
  return $storage[$key];
}

0 Спасибо
Аватар пользователя gun_dose
11 months 2 дня назад gun_dose #

Это откуда пример? Я вообще что успел выяснить:
1. Поиск текста "session_start" в проектах с quiz и уберкарт (два разных проекта) результатов не дал.
2. Тем не менее, и там и там $_SESSION используется чуть ли не везде. Да я и сам делал пару модулей, где просто писал данные в сессию и потом читал их оттуда совершенно спокойно без всяких session_start.
3. По печенькам - интересная тема. Во время начала теста появляется печенька с длинным непонятным названием, содержимое которой совпадает с последним айдишником сессии из таблицы sessions. Если удалить печеньку в процессе, то по нажатию кнопки ответа будет ошибка "доступ запрещён". То же самое будет, если удалить запись сессии из таблицы.
4. Исследование таблицы sessions показало, что она периодически очищается, тем не менее, первая запись в ней датирована раньше того момента, когда у юзеров был сбой.
5. Просто тупо с мобилы воспроизвести всё равно не получилось - пробовал в зонах неуверенного приёма, из лифта, отключал и включал передачу данных, перезагружал страницу, переключался с мобильного инета на вайфай - всё работает штатно.

Исходя из этого, есть два варианта - либо друпал умеет терять сессию, несмотря на выданную печеньку, либо мобильные браузеры в некоторых телефонах умеют терять печеньки.

Есть мысли по этому поводу?

0 Спасибо
Аватар пользователя Studio VIZA
11 months 2 дня назад Studio VIZA #

Надо прописать галочку, если абонент едет в метро, он должен уведомить об этом администрацию сайта, и вылететь на какой то промежуток времени. Нет абонента - нет проблем.

0 Спасибо
Аватар пользователя dashiwa
11 months 2 дня назад dashiwa #
gun_dose написал:
Это откуда пример?

В последнее время я знатный троль. Может жара в голову бьет?
По сессиям могу разьяснить как происходит все. Процесс бутстраппинга
Но не охота)

0 Спасибо
Аватар пользователя dashiwa
11 months 2 дня назад dashiwa #
gun_dose написал:
Во время начала теста появляется печенька с длинным непонятным названием, содержимое которой совпадает с последним айдишником сессии из таблицы sessions.

ээээ...Это же сессионная печенька. Кстати вопрос на засыпку ,попробуйте поднять сессию без печенек. Я не смог..
Хотя по идее должно ид через урлы отдавать.

0 Спасибо
Аватар пользователя gun_dose
11 months 2 дня назад gun_dose #

Да, без печенек не поднимается, если удалить печеньку, сессия теряется. Это всё понятно и логично. Непонятно, почему сессия может внезапно потеряться. Т.е. она создаётся, данные в неё пишутся и читаются, а потом бац и всё.

0 Спасибо
Аватар пользователя Orion76
11 months 2 дня назад Orion76 #

Пиши в лог сессионные переменные, куки, пост-гет запросы, переходы на 404..
Может чего и проясниться..

UPD: И время жизни сессии проверь..
Вот кстати прикольная статейка: https://habrahabr.ru/post/28418/

1 Спасибо
Аватар пользователя dashiwa
11 months 2 дня назад dashiwa #

Конфиги пхп проверить

0 Спасибо
Аватар пользователя gun_dose
11 months 2 дня назад gun_dose #
Orion76 написал:
UPD: И время жизни сессии проверь..

Вот кстати прикольная статейка: https://habrahabr.ru/post/28418/

Да, статья интересная, но к друпалу отношения не имеет. Даже в конфигах пхп написано, что хэндлер для хранения сессий не file, а user и сам этот хэндлер определяется в /includes/session.inc. Если в двух словах, то этот хэндлер и пишет данные сессий в таблицу sessions. Мусоросборщик чистит из таблицы просроченные сессии, время жизни сессии 200000 секунд, т.е. 55 с чем-то часов, судя по данным в таблице, собирается всё ровно по расписанию. Кстати говоря, сессионные переменные хранятся в той же таблице в сериализованном виде. Надо будет поковырять. А по поводу письма в лог, есть готовые решения для этих дел или самому кодить? Если самому, то в template.php где-нибудь подойдёт?

0 Спасибо
Аватар пользователя gun_dose
11 months 1 день назад gun_dose #

Внезапно удалось узнать, в чём проблема! Просто некоторые юзеры иногда случайно или от нервности жмут кнопку ответа два раза - такой слегка растянутый двойной клик и у quiz срабатывает код <?php  return "Ой, всё!";  ?> На друпалорге по этому поводу даже патч нашёлся.

Всем спасибо за содержательную и познавательную дискуссию))))

0 Спасибо