2010-07-23 3 views
0

Je vais avoir un problème particulier de faire des requêtes AJAX simultanées qui modifient un objet PHP stocké dans la session. J'ai des problèmes avec les conditions de course, mais je ne comprends pas pourquoi ils se produisent ... un seul appel AJAX peut ouvrir la session à la fois, donc s'ils gardent la session ouverte tout en apportant des modifications, ne devrait-il pas appel être en mesure de voir les changements effectués par les autres? Voici une version simplifiée du flux (A et B sont deux ensembles de paramètres):simultanées des requêtes AJAX et PHP Sessions

1) Un appel AJAX est fait qui court Initié (A). Cet appel ouvre la session. Il met à jour l'objet PHP en ajoutant "A - Running" à un tableau.
2) Un appel AJAX à Run (A) est effectué. Il attend jusqu'à ce que Initiate (A) ferme la session puis s'exécute. Il ouvre brièvement la session mais la ferme explicitement et ne modifie pas l'objet. L'exécution (A) prendra jusqu'à 60 secondes pour s'exécuter.
3) Un autre appel AJAX est exécuté, qui lance Initiate (B). Cela ouvre la session et modifie l'objet en ajoutant "B - Running" au tableau.
4) Un autre appel AJAX est fait pour exécuter (B). Il ouvre la session brièvement mais la ferme explicitement.

Jusqu'à présent, tout est génial. Exécuter (A) et Exécuter (B) s'exécutent tous les deux. "A - Running" et "B - Running" sont tous deux dans le tableau de l'objet, stockés dans la session qui n'est ouverte dans aucune des deux requêtes. Voici où les choses deviennent drôles:

5) Run (A) fin de l'exécution d'abord et un appel AJAX est fait qui passe Show (A). Cela ouvre la session, récupère l'objet et change "A - Running" en "A - Complete". Chose amusante, "Running - B" n'est pas là du tout.
6) Lorsque Run (B) se termine, un appel AJAX est exécuté pour exécuter Show (B). Cela ouvre la session et récupère l'objet. Il change "B - Running" en "B - Complete". Cependant, le premier élément du tableau est "A - Running".

Si la session est fermée et enregistrée, lorsque l'option Afficher (A) ouvre, pourquoi ne peut-il voir les modifications apportées par Initier (B)? Et quand Initiate (B) peut clairement voir les changements effectués par Initiate (A), mais Show (B) ne peut pas voir ce que Show (A) a fait ...

Des problèmes similaires se produisent si Run (B) a terminé avant Exécuter (A).

+0

Utilisez-vous votre propre gestionnaire de session au lieu de celui qui utilise les fichiers sur le disque? – Charles

+0

Nous utilisons un framework externe (eyeOS), mais je ne vois aucun appel à session_set_save_handler n'importe où dans son code. Il n'y a pas d'autre moyen d'utiliser des gestionnaires de session personnalisés est là? Je vois aussi un/tmp/sess_ (mon session_id) sur le serveur. – Derek

+0

Les chances sont que vous utilisez le système de session basé sur les fichiers, alors. Cela ressemblait à un cas de gestionnaire de session personnalisé et de verrouillage de base de données, mais maintenant je ne suis plus si sûr. – Charles

Répondre

1

Il semble être lié au framework eyeOS. On dirait que depuis que je fais un session_write_close() au début de ma fonction Run, je dois session_start() à la fin de ma fonction Run ... sinon eyeOS n'est pas capable de nettoyer correctement ou quelque chose.

Je travaille sur et désactiver cette fonction pendant 3 jours. Morale de l'histoire: n'utilisez pas eyeOS pour le développement!

Questions connexes