Сведения о вопросе

Ислам

02:03, 13th August, 2020

Теги

PHP   Сессии    

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

Просмотров: 353   Ответов: 2

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


<?php



session_start();



if (!isset($_SESSION['a']))

{

	$_SESSION['a'] = 0;

}



ob_start();



print $_SESSION['a'];



$_SESSION['a']++;



session_regenerate_id(true);



?>



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

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

Лечится?



  Сведения об ответе

lool

15:59, 23rd August, 2020

Судя по всему здесь возникает состояние гонки (race condition) из-за множества параллельных запросов, пытающихся записать свои данные в файл с сессиями. Добавьте перед session_regenerate_id(true); вызов session_write_close(); читайте, кстати, описание к этой функции.
Вообще, чтобы такого не происходило, session_regenerate_id(true); обычно ставят сразу после вызова session_start();.
С вашим синтетическим примером у меня получилось в обоих случаях.


  Сведения об ответе

DO__IT

05:08, 26th August, 2020

а для чего вообще session_regenerate_id использовать?


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться