Обработка сеанса PHP, когда один и тот же клиент запрашивает один и тот же скрипт несколько раз одновременно
Итак, вот моя тестовая настройка:
session_start();
if(!isset($_SESSION['bahhhh']))
$_SESSION['bahhhh'] = 0;
$_SESSION['bahhhh']++;
sleep(5);
die('a'.$_SESSION['bahhhh']);
Я ожидаю, что каждый раз, когда я захожу на страницу, она возвращает другой номер.
Но если я использую несколько вкладок и обновляю их каждую в течение 5 секунд после первой, все они возвращают одно и то же число. (Это не кэширование на стороне клиента, так как 5-секундная задержка все еще очевидна.)
Почему он это делает и как мне это исправить?
Похоже, что у него такая же странная проблема с кэшированием файлов и данных базы данных, и мешает мне создать рабочий мьютекс, чтобы предотвратить выполнение одного и того же кода более одного раза за раз.
Вот еще один, более простой пример:
echo microtime();
sleep(10);
Выполните это 3 раза с интервалом в 2 секунды, и все три вернут одну и ту же микросекунду. ВТФ?
3 answers
Данные сеанса по умолчанию не сохраняются до завершения запроса. Таким образом, ваше приращение не сохраняется во время сна. Если вы хотите сохранить сеанс преждевременно, оформите заказ session_write_close()
Я бы попросил сам скрипт добавить что-нибудь в файл журнала, чтобы убедиться, что сценарий действительно выполняется столько раз, сколько вы думаете. Возможно, у вас где-то есть какое-то программное обеспечение, которое перехватывает запрос и возвращает кэшированный ответ.
Если бы не ваш комментарий о том, что это также происходит с microtime(), я бы объяснил, как php управляет совместимостью с сеансами, и когда это может быть не так.
По-видимому, это какая-то ошибка в самом моем браузере. Opera ведет себя таким образом, в то время как Internet Explorer этого не делает. Я провел первоначальное тестирование в IE с теми же результатами, но с более сложным кодом. По-видимому, в этом сложном коде была ошибка, которая вызвала неправильное поведение в IE, а в этом упрощенном коде этого нет. Извините, что всех беспокою.