2010-03-01 1 views
3

Так вот мой тест установка: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 секунды, и все три возвращают же микросекунду. WTF?

ответ

6

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

+0

Как я уже сказал, я также использовал файлы и базы данных для этого подхода. Вот еще один тестовый скрипт, который не может себя вести должным образом: echo microtime(); сон (10); Если вы открываете это на нескольких вкладках, обновляйте их каждые 10 секунд друг от друга, когда-либо табуляция будет требовать, чтобы она была вызвана в тот же самый микросекунда (явная невозможность). – VexedPanda

+0

Я не понимаю, какой носитель информации подходит для вашей проблемы. Я протестировал ваш скрипт на 5 вкладках, обновляя их каждые 10 секунд друг от друга и каждый раз получал разные результаты. Протестировано с последним 5.2.x на ubuntu 9.10. –

0

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

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

+0

Сложность написания файла заключается в том, что, поскольку такие вещи, как microtime(), возвращают один и тот же результат для всех экземпляров, я не смог бы различать все три записи в файл (так как это в конечном итоге будет тем же именем файла), или только один. Тем не менее, ошибка, с которой мы сталкиваемся в процессе производства, заключается в том, что скрипт maintanence работает более одного раза и сам сталкивается с условиями гонки, поэтому я уверен, что все три копии фактически выполнены. Вот почему мы пытаемся построить мьютекс. – VexedPanda

0

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

Смежные вопросы