Обработка сеанса 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 секунды, и все три вернут одну и ту же микросекунду. ВТФ?

Author: VexedPanda, 2010-03-02

3 answers

Данные сеанса по умолчанию не сохраняются до завершения запроса. Таким образом, ваше приращение не сохраняется во время сна. Если вы хотите сохранить сеанс преждевременно, оформите заказ session_write_close()

 6
Author: Mike B, 2010-03-01 21:08:01

Я бы попросил сам скрипт добавить что-нибудь в файл журнала, чтобы убедиться, что сценарий действительно выполняется столько раз, сколько вы думаете. Возможно, у вас где-то есть какое-то программное обеспечение, которое перехватывает запрос и возвращает кэшированный ответ.

Если бы не ваш комментарий о том, что это также происходит с microtime(), я бы объяснил, как php управляет совместимостью с сеансами, и когда это может быть не так.

 0
Author: goat, 2010-03-02 02:06:12

По-видимому, это какая-то ошибка в самом моем браузере. Opera ведет себя таким образом, в то время как Internet Explorer этого не делает. Я провел первоначальное тестирование в IE с теми же результатами, но с более сложным кодом. По-видимому, в этом сложном коде была ошибка, которая вызвала неправильное поведение в IE, а в этом упрощенном коде этого нет. Извините, что всех беспокою.

 0
Author: VexedPanda, 2010-03-02 16:40:54