Одновременные запросы AJAX и сеансы PHP - PullRequest
0 голосов
/ 24 июля 2010

У меня есть особая проблема с одновременным выполнением запросов AJAX, которые изменяют объект PHP, сохраненный в сеансе. У меня проблемы с условиями гонки, но я не понимаю, почему они происходят ... сеанс может быть открыт только один вызов AJAX за раз, поэтому, если они оставляют сеанс открытым во время внесения изменений, не должен каждый Звоните, чтобы увидеть изменения, сделанные другими? Вот упрощенная версия потока (A и B - два набора параметров):

1) Сделан AJAX-вызов, который запускает Initiate (A). Этот звонок открывает сессию. Он обновляет объект PHP, добавляя «A - Running» в массив.
2) AJAX-вызов Run (A) сделан. Он ожидает, пока Initiate (A) не закроет сеанс, а затем запустится. Он кратко открывает сеанс, но явно закрывает его и не изменяет объект. Запуск (A) займет до 60 секунд.
3) Сделан еще один вызов AJAX, который запускает Initiate (B). Это открывает сеанс и изменяет объект, добавляя «B - Running» в массив.
4) Еще один вызов AJAX сделан для запуска (B). Он открывает сессию на короткое время, но явно закрывает ее.

Пока все отлично. Выполнение (A) и Выполнение (B) оба выполняются. И «A - выполняется», и «B - выполняется» находятся в массиве объекта, который хранится в сеансе, который не открыт ни в одном запросе. Вот где все смешно:

5) Выполнение (A) сначала завершает выполнение, и выполняется вызов AJAX, который выполняет Show (A). Это открывает сеанс, извлекает объект и изменяет «A - Выполняется» на «A - Завершено». Забавно то, что «Бег - Б» там вообще нет.
6) Когда Run (B) заканчивается, выполняется вызов AJAX, который выполняет Show (B). Это открывает сеанс и получает объект. Это изменяет "B - Бег" на "B - Завершено". Однако первым элементом в массиве является «A - Running».

Если сеанс закрыт и сохранен, когда Show (A) открывает его, почему он не может видеть изменения, сделанные Initiate (B)? И когда Посвященный (B) может ясно видеть изменения, сделанные Посвященным (A), но Шоу (B) не может видеть, что сделал Шоу (A) ...

Аналогичные проблемы возникают, если прогон (B) завершен до прогона (A).

1 Ответ

1 голос
/ 24 июля 2010

Похоже, это связано с платформой eyeOS. Похоже, что так как я выполняю session_write_close () в начале своей функции Run, мне нужно выполнять session_start () в конце моей функции Run ... в противном случае eyeOS не сможет очистить должным образом или что-то в этом роде.

Я работал над этим в течение 3 дней. Мораль истории: не используйте eyeOS для разработки!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...