[Решено] PHP и потеря сессии при session_regenerate_id()

Если кратко, берем код:

<?php

session_start();

if (!isset($_SESSION['a']))
{
	$_SESSION['a'] = 0;
}

ob_start();

print $_SESSION['a'];

$_SESSION['a']++;

session_regenerate_id(true);

?>


Открываем в firefox, обновляем страницу несколько раз. Счетчик растет.
Зажимаем Ctrl-R и видим, что потеряли сессию.

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

Лечится?
  • Вопрос задан
  • 6657 просмотров
Решения вопроса 1
conf
@conf
Ruby developer
Судя по всему здесь возникает состояние гонки (race condition) из-за множества параллельных запросов, пытающихся записать свои данные в файл с сессиями. Добавьте перед session_regenerate_id(true); вызов session_write_close(); читайте, кстати, описание к этой функции.
Вообще, чтобы такого не происходило, session_regenerate_id(true); обычно ставят сразу после вызова session_start();.
С вашим синтетическим примером у меня получилось в обоих случаях.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Nc_Soft
а для чего вообще session_regenerate_id использовать?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы